迄今为止,我们已经学习了几种检索的方法,归纳一下:
首先,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!