zoukankan      html  css  js  c++  java
  • Lucene笔记二

    lucene 的排序

    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  的过滤器

    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 的高亮器的使用

    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 查询条件的使用

    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"));
                
            }        
            
            
        } 
    }
  • 相关阅读:
    前端面试题六
    前端面试题五
    前端面试题四
    前端面试题之三
    前端面试题分享二
    前端面试题分享一
    JS学习笔记一
    git使用学习笔记一
    常见User-Agent
    ado.net之SQLServer和Oracle (sys_cursor) 数据库链接——获取结果集方式对比
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9484212.html
Copyright © 2011-2022 走看看