迄今为止,我们已经学习了几种检索的方法,归纳一下:
首先,reader
IndexReader reader=IndexReader.open(path);
for(int i=0;i<reader.numDocs();i++)
{
System.out.println(reader.document(i);
}
System.out.println(reader.getVersion);
System.out.println(reader.numDocs());
for(int i=0;i<reader.numDocs();i++)
{
System.out.println(reader.document(i);
}
System.out.println(reader.getVersion);
System.out.println(reader.numDocs());
numDocs为文档的数量,getVersion版本信息,reader.document(i)为各个document的所有field信息。
其次,TermDocs与reader
Term term=new Term("bookname","女");
TermDocs termDocs=new TermDocs(term);
while(termDocs.next())
{
System.out.println(termDocs.doc());
System.out.println(termDocs.freg());
}
TermDocs termDocs=new TermDocs(term);
while(termDocs.next())
{
System.out.println(termDocs.doc());
System.out.println(termDocs.freg());
}
termDocs.doc()表示Document的编号,即为ID值,termDocs.freg()表示出现的频率。
第三,Hits
IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH)
Hits hits = searcher.search(q);
for (int i = 0; i < hits.length(); i++)
{
System.out.println(hits.doc(i));
System.out.println(hits.score(i));
System.out.println(hits.id(i));
System.out.println("===============");
}
Hits hits = searcher.search(q);
for (int i = 0; i < hits.length(); i++)
{
System.out.println(hits.doc(i));
System.out.println(hits.score(i));
System.out.println(hits.id(i));
System.out.println("===============");
}
更进一层:
IndexSearcher searcher=new IndexSearcher(path);
Hits hits=searcher.search(q);
for(int i=0;i<hits.length();i++)
{
Document doc=hits.doc(i);
System.out.println("书号:");
System.out.println(doc.get("bookNumber"));
System.out.println("书名:");
System.out.println(doc.get("bookname"));
System.out.println("出版日期:");
System.out.println(doc.get("publishdate"));
}
Hits hits=searcher.search(q);
for(int i=0;i<hits.length();i++)
{
Document doc=hits.doc(i);
System.out.println("书号:");
System.out.println(doc.get("bookNumber"));
System.out.println("书名:");
System.out.println(doc.get("bookname"));
System.out.println("出版日期:");
System.out.println(doc.get("publishdate"));
}
最后综合一下:
IndexSearcher searcher=new IndexSearcher(INDEX_STORE_PATH);
Term t=new Term(searchType,searchKey);
Query q=new TermQuery(t);
TermDocs termDocs=searcher.getIndexReader().termDocs(t);
while(termDocs.next())
{
System.out.println(termDocs.freq());
System.out.println(searcher.getIndexReader().document(termDocs.doc()));
}
Term t=new Term(searchType,searchKey);
Query q=new TermQuery(t);
TermDocs termDocs=searcher.getIndexReader().termDocs(t);
while(termDocs.next())
{
System.out.println(termDocs.freq());
System.out.println(searcher.getIndexReader().document(termDocs.doc()));
}
上面的例子综合前面所讲的几种,看看能能看懂。
此时我们改一改上一个例子吧
final BitSet bits=new BitSet(reader.maxDoc());
bits.set(0,bits.size()-1);
Term term=new Term("securitylevel",SECURITY_ADVANCED+"");
IndexSearcher searcher=new IndexSearcher(reader);
Hits hits=searcher.search(new TermQuery(term));
for(int i=0;i<hits.length();i++)
{
bits.set(hits.id(i),false);
}
return bits;
bits.set(0,bits.size()-1);
Term term=new Term("securitylevel",SECURITY_ADVANCED+"");
IndexSearcher searcher=new IndexSearcher(reader);
Hits hits=searcher.search(new TermQuery(term));
for(int i=0;i<hits.length();i++)
{
bits.set(hits.id(i),false);
}
return bits;
对比于上一个直接用底层API进行比较,这里用了先搜索再设置过滤操作。
OK!