Lucene的检索

Lucene检索
IndexReader:一个抽象类,提供访问索引的接口。检索一个索引是完全通过这个抽象借口来完成的。所以其所有的实现子类都是可搜索的。
其具体子类一般通过调用它的静态方法open来实现。
从性能考虑,在这个API,document会经常通过document号来访问,这个号是一个非负整数,但这些数是暂时的,它们会随着document的添加或删除而改变。所以客户端不应该企图在两个session中用相同的号取得document。
即使一个IndexWriter已经打开,也能再同样的目录上打开IndexReader,但是不能删除document。
IndexReader是线程安全的。

IndexSearcher:应用程序通常只需要调用内部方法search(Query,int)或者search(Query,Filter,int)。从性能方面考虑,如果索引是不经常改变的,你可以共享一个IndexSearcher而不是每次检索都创建一个。如果索引是经常改变的,并且还希望检索改变后的索引,应该调用IndexReader.reopen()获得一个新的reader,然后以此创建一个新的IndexSearcher。当然,为了降低延迟,可以使用实时reader(IndexReader.open(IndexWriter, boolean))。
IndexSearcher是线程安全的。

Term:代表文本中的一个词。它是搜索单元,它由两个元素组成,所搜索的词和这个词可能出现的域(field)

检索可以分为两类:简单搜索和分析搜索

简单搜索就是你所输入的关键词不需要使用分词器进行处理。程序会把所输入的关键字作为一个Term进行搜索。简单搜索的类主要是 Query的实现子类:TermQuery、BooleanQuery、WildcardQuery、PrefixQuery、FuzzyQuery、TermRangeQuery、NumericRangeQuery。
分析搜索就是把所输入的关键词进行分词处理,然后在某个域中查找含有已进行分词处理的关键字的document。PhraseQuery、MultiPhraseQuery。


TermQuery:
检索一个document的某个filed含有关键字
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new TermQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());


PrefixQuery:
带前缀搜索,比如输入一个ti,就可以搜索出title的数据
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new PrefixQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
WildcardQuery:
通配符搜索,*代表0个或多个字符,?代表单个字符
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new WildcardQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
FuzzyQuery:
模糊查询,这种查询有个相识度匹配,默认情况下要把keyword检索出来至少需要输入keywo,而输入keyw则不可以
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
Query query = new FuzzyQuery(new Term("title", keyword));
topDocs = searcher.search(query, searcher.maxDoc());
TermRangeQuery:
查询位于两个term之间的值,比如有titla、titlb、titlc、title。如果起始为titla,结束为title则会把上面的记录都搜索出来
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//两个true表示包含起始和结束位置的term
Query query = new TermRangeQuery("title",keyword1, keyword2, true, true);
topDocs = searcher.search(query, searcher.maxDoc());

PhraseQuery:匹配输入特定term序列,有PhraseQuery构建。

NumericRangeQuery:在一个指定的范围内进行数字匹配。这个类只能进行数字检索。如果要进行文字检索则使用TermRangeQuery

BooleanQuery:用于在多个Query语句之间进行有效的配合搜索。
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));

BooleanQuery query = new BooleanQuery();
Query query1 = new TermQuery(new Term("title", keyword));
Query query2 = new TermQuery(new Term("content", keyword));

query.add(query1, BooleanClause.Occur.MUST);
query.add(query2, BooleanClause.Occur.SHOULD);

topDocs = searcher.search(query, searcher.maxDoc());
BooleanClause.Occur.MUST表示所搜索的关键字必须在此子句中出现。
BooleanClause.Occur.SHOULD表示所搜索的关键字可以在此子句中出现。
BooleanClause.Occur.MUST_NOT表示所搜索的关键字不能在此子句中出现。


经过分析器的搜索
在单一域中搜索
IndexReader indexReader = IndexReader.open(FSDirectory.open(new File("D:\\lucene")));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
QueryParser parser = new QueryParser(Version.LUCENE_34, "title", new StandardAnalyzer(Version.LUCENE_34));
Query query = parser.parse(title);
System.out.println("query:" + query.toString());
topDocs = indexSearcher.search(query, indexSearcher.maxDoc());
在多个域中搜索
IndexSearcher searcher = new IndexSearcher(FSDirectory.open(new File("D:\\lucene")));
//在多个Field中搜索
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_34, new String[] {"content","title"}, new StandardAnalyzer(Version.LUCENE_34));

Query query = parser.parse(title);
topDocs = searcher.search(query, searcher.maxDoc());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zm274310577

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值