几种检索的方法

本文详细介绍了使用Lucene进行信息检索的各种方法,包括利用IndexReader读取文档信息、使用TermDocs进行词项频率检索以及通过IndexSearcher实现精确匹配搜索等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迄今为止,我们已经学习了几种检索的方法,归纳一下:

首先,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());

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

更进一层:

 

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

最后综合一下:

 

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

上面的例子综合前面所讲的几种,看看能能看懂。

 此时我们改一改上一个例子吧

 

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;

对比于上一个直接用底层API进行比较,这里用了先搜索再设置过滤操作。

OK!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值