纵有疾风起
人生不言弃

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"));                    }                            } }

 

文章转载于:https://www.cnblogs.com/lm970585581/p/9484212.html

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » Lucene笔记二

分享到: 生成海报
avatar

评论 抢沙发

评论前必须登录!

立即登录   注册

切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活