Lucene搜索过程的核心类
IndexReader
搜索由IndexWriter类创建的索引
Term
搜索功能的基本单元,与Filed类似, Term 包括域名和单词 (Filed 包含域名和句子)
Query
TermQuery
TopDocs
是一个简单的指针容器,一般指向前N个排名的搜索结果
///////////////////////////////////////////////////////////////////////
搜索是一个比较重要的过程,可以根据不同的条件查询出不同的结果
Lucene提供了好多方法进行搜索
4.x 以后的改了好多
像我们比较常用的
QueryParser parser =new QueryParser(Version.LUCENE_31, "content", analyzer);
这个类就没有了,我们可以用BooleanQuery来替代他 ,等等。
具体 详细方法如下:
(1)通过项(TermQuery)类进行搜索
private void search() { try{ String field = "D://index"; Directory dir = FSDirectory.open(new File(field)); IndexReader reader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); // BooleanQuery booleanQuery = new BooleanQuery(); Term term = new Term("content" ,"你"); Query query = new TermQuery(term); // Term term1 = new Term("content" ,"好吧"); // Query query1 = new TermQuery(term1); // booleanQuery.add(query, Occur.SHOULD); // booleanQuery.add(query1,Occur.SHOULD); // TermQuery query = new TermQuery(term); TopDocs topdocs = searcher.search(query, 100); ScoreDoc[] scoreDocs = topdocs.scoreDocs; System.out.println("查询结果总数---" + topdocs.totalHits+"最大的评分--"+topdocs.getMaxScore()); for(int i=0; i < scoreDocs.length; i++) { int doc = scoreDocs[i].doc; Document document = searcher.doc(doc); System.out.println("content===="+document.get("content")); System.out.println("id--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score+"---index--"+scoreDocs[i].shardIndex); } reader.close(); }catch(Exception e){ e.printStackTrace(); } }
需要注意的是这个查询方法对查询词的大小写敏感的,所以如果你的数据是对大小写很敏感的话,建议使用此方法,不过得选好合适的分词器
不要在建立索引的时候将大小写统一了。
(2) 通过指定项的范围进行查询( TermRangeQuery)
private void search() { try{ String field = "D://index"; Directory dir = FSDirectory.open(new File(field)); IndexReader reader = DirectoryReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); // BooleanQuery booleanQuery = new BooleanQuery(); TermRangeQuery termRangeQuery = TermRangeQuery.newStringRange("id", "0", "1", true, true); // Term term = new Term("content" ,"你"); // Query query = new TermQuery(term); // Term term1 = new Term("content" ,"好吧"); // Query query1 = new TermQuery(term1); // booleanQuery.add(query, Occur.SHOULD); // booleanQuery.add(query1,Occur.SHOULD); // TermQuery query = new TermQuery(term); TopDocs topdocs = searcher.search(termRangeQuery, 100); ScoreDoc[] scoreDocs = topdocs.scoreDocs; System.out.println("查询结果总数---" + topdocs.totalHits+"最大的评分--"+topdocs.getMaxScore()); for(int i=0; i < scoreDocs.length; i++) { int doc = scoreDocs[i].doc; Document document = searcher.doc(doc); System.out.println("content===="+document.get("content")); System.out.println("id--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score+"---index--"+scoreDocs[i].shardIndex); } reader.close(); }catch(Exception e){ e.printStackTrace(); } }
该程序查询了id是 0 到1 的索引,true 表示包含边界的意思
(3)