使用Apache Lucene

时间:2018-11-22 17:35:37

标签: elasticsearch search solr lucene full-text-search

在对Apa​​che Lucene v7.5进行基准测试时,我注意到了一个奇怪的行为: 我使用Lucene和SimpleAnalyzer(没有停用词,没有词干)为英语维基百科转储(5,677,776文档)建立了索引。

然后我用以下查询搜索了索引:

  • the totalHits = 5,382,873
  • ,总命中率= 1,687,254
  • 谁总计hits = 5,411,305
  • “谁” totalHits = 8,827

布尔查询 的结果号都大于单个术语 the 的结果号以及单项 的结果数(应小于两者)。

对此有解释吗?

代码段:

analyzer = new SimpleAnalyzer();
MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[]{"title", "content","domain","url"},analyzer);

// Parse
Query q = parser.parse(querystr);

// top-10 results
int hitsPerPage = 10;

IndexReader indexReader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(indexReader);

// Ranker
TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage);

// Search
searcher.search(q, collector);

// Retrieve the top-10 documents
TopDocs topDocs=collector.topDocs();

ScoreDoc[] hits = topDocs.scoreDocs;
totalHits=topDocs.totalHits;


System.out.println("query: "+querystr + " " + hits.length+" "+String.format("%,d",totalHits));

1 个答案:

答案 0 :(得分:1)

解释是您假设的the default operator is OR,而不是AND。搜索the who将返回具有thewho或两者都有的文档。

the - 5,382,873
who - 1,687,254
the OR who - 5,411,305

即包含who的大多数文档还包含the,但当您同时检索到两者时,会将28 432个文档添加到结果集中。

您可以通过更改默认运算符来更改此行为:

parser.setDefaultOperator(QueryParserBase.AND_OPERATOR)