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")); } } }
微信搜索“HUC思梦”关注我吧,关注有惊喜,不定时有免费资源分享!