前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lucene笔记二

Lucene笔记二

作者头像
HUC思梦
发布2020-09-03 15:56:35
5790
发布2020-09-03 15:56:35
举报

lucene 的排序

代码语言:javascript
复制
package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.SortField.Type;

import cn.itcast.uitls.LuceneUtils;

/**
 * 
 * 根据lucene 的字段的名称进行排序...
 * 
 * 对查询出来的结果进行排序\
 * 加了排序条件之后,每个文档得分将失效..
 * @author Administrator
 *
 */
public class TestSort1 {
    
    public static void main(String[] args) throws Exception {
        IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
        String keywords="全文检索服务器";
        
        String fields []={"content"};
        
        QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
        
        Query query=queryParser.parse(keywords); 
        
        //需要根据那个字段进行排序
        /**
         * 1:需要根据那个字段进行排序
         * 
         * 2:排序的字段对应的类型
         * 
         * 3:是否反转  (升序(true) 降序 (false))
         * 
         */
        SortField sortField=new SortField("id", Type.INT,true);
        //设置排序的条件
        Sort sort=new Sort(sortField);
        TopDocs topDocs=indexSearcher.search(query, 100, sort);
        ScoreDoc scoreDocs[]=topDocs.scoreDocs;
        for(ScoreDoc scoreDoc :scoreDocs){
            //根据id 去击中一个文档呢..
            Document document=indexSearcher.doc(scoreDoc.doc);
            //每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
            System.out.println("id==="+document.get("id")+"得分===="+scoreDoc.score);
            System.out.println("title==="+document.get("title"));
            System.out.println("content==="+document.get("content"));
            System.out.println("url==="+document.get("url"));
            System.out.println("author==="+document.get("author"));
            
        }        
    }

}

lucene 的过滤器

代码语言:javascript
复制
package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeFilter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

import cn.itcast.uitls.LuceneUtils;

/**
 * 
 * 对查询出来的结果进行过滤,以获得更小范围的结果...
 * @author Administrator
 *
 */
public class TestFilter {
    public static void main(String[] args) throws Exception {
        IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
        String keywords="全文检索服务器";
        
        String fields []={"content"};
        
        QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
        
        Query query=queryParser.parse(keywords);
        
        //过滤器
        /**
         * 1:需要根据那个字段进行过滤
         * 
         * 2:字段对应范围的最小值
         * 
         * 3:字段对应范围的最大值
         * 
         * 4:是否包含最小值
         * 
         * 5:是否包含最大值...
         *     
         */
        /**
         * 
         * Filter 是一个抽象类,我们后面可以继承它,来定义我们 自己的过滤规则,
         * 
         * 使用过滤的效率比较低,我们在后面可以使用其它查询条件实现一样的效果,性能比过滤器要高...
         */
        Filter filter=NumericRangeFilter.newIntRange("id",2, 10,true, false);
        
        TopDocs topDocs=indexSearcher.search(query, filter, 100);
        
        ScoreDoc scoreDocs[]=topDocs.scoreDocs;
        for(ScoreDoc scoreDoc :scoreDocs){
            //根据id 去击中一个文档呢..
            Document document=indexSearcher.doc(scoreDoc.doc);
            //每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
            System.out.println("id==="+document.get("id"));
            System.out.println("title==="+document.get("title"));
            System.out.println("content==="+document.get("content"));
            System.out.println("url==="+document.get("url"));
            System.out.println("author==="+document.get("author"));
        }        
        
        
    }
}

lucene 的高亮器的使用

代码语言:javascript
复制
package cn.itcast.lucene;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.SortField.Type;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;

import cn.itcast.bean.Article;
import cn.itcast.uitls.LuceneUtils;

/**
 * 
 * 测试高亮,
 * 
 * 使用高亮的时候我们需要导入两个jar
 * lucene-highlighter-4.4.0.jar
 * lucene-memory-4.4.0.jar
 * 
 * 
 * @author Administrator
 * 对查询出来的结果当中包含的搜索关键字进行高亮...
 */
public class TestHighlighter {
    
    public static void main(String[] args) throws Exception {
        IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
        String keywords="全文检索服务器";
        String fields []={"content"};
        QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
        Query query=queryParser.parse(keywords);
        TopDocs topDocs=indexSearcher.search(query, 1);
        ScoreDoc scoreDocs[]=topDocs.scoreDocs;
        
        //高亮显示的格式...
//        solr 是基于lucene 的<font color='blue'>全</font><font color='blue'>文</font><font color='blue'>检</font>索服务器
        Formatter formatter=new SimpleHTMLFormatter("<font color='red'>","</font>");
        
        //与query 查询条件进行关联,因为query 包含了搜索的关键字
        //只有知道了搜索的关键字,高亮显示的格式,我才能把一段文本进行高亮...
        Scorer scorer=new QueryScorer(query);
        
        //创建一个高亮器,我们使用lucene 自带的高亮器进行高亮..
        Highlighter highlighter=new Highlighter(formatter,scorer);
        
        List<Article> articles=new ArrayList<Article>();
        
        Article article=null;
        
        for(ScoreDoc scoreDoc :scoreDocs){
            article=new Article();
            Document document=indexSearcher.doc(scoreDoc.doc);
            String title=document.get("title");
            String content=document.get("content");
            System.out.println("id=="+document.get("id"));
            System.out.println("title==="+title);
            System.out.println("content==="+content);
            System.out.println("没有高亮之前的结果....----------------------------------------------------");
            
            
            if(content!=null){
                //返回高亮过后的文本...
                String highcontent=highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", content);
                System.out.println("高亮过后的highcontent="+highcontent);
                if(highcontent==null){
                    article.setContent(content);
                }else{
                    article.setContent(highcontent);
                }
            }
            
            
            if(title!=null){
                String hightitle=highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "title", title);
                
                //假设我们对一段文本进行高亮,如果这段文本当中不包含搜索关键字,对这段文本高亮,返回的结果为null
                System.out.println("高亮过后的hightitle="+hightitle);
                
                //不能把null 返回到客户端,所以我们需要进行判断,如果为null值,就返回没有高亮之前的文本,
                if(hightitle==null){
                    article.setTitle(title);
                }else{
                    article.setTitle(hightitle);
                }
                
                
            }
     
            //title 当中有没有可能不包含搜索的关键字...
        

        }        
    }

}

lucene 查询条件的使用

代码语言:javascript
复制
package cn.itcast.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.BooleanClause.Occur;

import cn.itcast.uitls.LuceneUtils;

public class TestQuery {
    
    
    public static void main(String[] args) throws IOException, ParseException {
//        article.setId(i);   intfield
//        article.setTitle("lucene 是传智播客一个工具包");  textfield
//        article.setContent("solr 是基于lucene 的全文检索服务器"); textfield
//        article.setUrl("http://apche.cn"); StringField
//        article.setAuthor("爱新觉罗王姐杰杰结节"); StringField
        
//        1:第一种查询条件: 单字段查询..
//        Query query=new TermQuery(new Term("title","传"));
        
        //2:第二种查询:多字段查询,字符串搜索...
//        String fields []={"title"};
//        
//        String keywords="传智播客";
//        
//        QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getVersion(),fields,LuceneUtils.getAnalyzer());
//        //会使用分词器把关键字进行分词之后再组拼查询条件...
//        Query query=queryParser.parse(keywords);

        //第三种查询:查询所有..
//        Query query=new MatchAllDocsQuery();
        //第四种查询,通配符查询...
        //? 代表单个的任意字符,* 代表是多个任意字符
        //使用*代表匹配的结果越多,性能越低...
//        Query query=new WildcardQuery(new Term("title","luce*"));
        
        //第五种查询:范围查询:可以使用此查询来替代过滤器..
//        Query query=NumericRangeQuery.newIntRange("id", 1, 10, true, false);
        
        //第六种查询:模糊查询...
        /**
         * 1:查询的条件term 
         * 
         * 2:maxEidts 默认值为2  ,最大的可编辑数,允许我的查询当中的值可以错误几个字符..
         * 
         */
//        FuzzyQuery query=new FuzzyQuery(new Term("author","爱新觉罗王姐杰杰班长"),2);
        
        
//        /第七种查询:短语查询:
        
//        PhraseQuery query=new PhraseQuery();
//        //lucene 是传智播客一个工具包
//        query.add(new Term("title", "lucene"));
//        query.add(new Term("title", "具"));
//        
//        //设置两个短语之间的最大间隔数..
//        //如果设置短语的间隔越小,越是我们想要的数据,
//        //如果设置的短语的间隔越大,被匹配到的内容越多,性能越慢...
//        query.setSlop(1111111111);
        
        
        //第八种查询,boolean 类型的查询..
        
        
        BooleanQuery query=new BooleanQuery();
        
        //查询条件1
        //1,9
        Query query1=NumericRangeQuery.newIntRange("id", 1, 10, true, false);
        
        //6~17
        Query query2=NumericRangeQuery.newIntRange("id", 6, 18, true, false);
        
        //select * from table where username ="bangzhang" and  sex ='nv'
        
        //boolean 组拼多个查询条件,取交集...
        //=
        query.add(query1,Occur.MUST);
        
        //!=
        query.add(query2, Occur.MUST_NOT);
        
        //or
        query.add(query2, Occur.SHOULD);
        
        testQuery(query);
    }
    
    public static void testQuery(Query query) throws IOException{
        IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
        TopDocs topDocs=indexSearcher.search(query, 100);
        ScoreDoc scoreDocs[]=topDocs.scoreDocs;
        for(ScoreDoc scoreDoc :scoreDocs){
            //根据id 去击中一个文档呢..
            Document document=indexSearcher.doc(scoreDoc.doc);
            //每个文档都有一个得分,这个得分是float 类型,他是lucene 自己内部算出来,VSM
            System.out.println("id==="+document.get("id"));
            System.out.println("title==="+document.get("title"));
            System.out.println("content==="+document.get("content"));
            System.out.println("url==="+document.get("url"));
            System.out.println("author==="+document.get("author"));
            
        }        
        
        
    } 
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • lucene 的排序
  • lucene 的过滤器
  • lucene 的高亮器的使用
  • lucene 查询条件的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档