【发布时间】:2017-01-03 14:17:27
【问题描述】:
我观察到一个奇怪的行为,但我看不出我做错了什么。
我通过多个 BooleanQueries 创建了以下查询:
+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:*
...这是我通过toString得到的
更新:这样我创建了 BooleanQuery 的一部分,它负责创建这个 sn-p +Request.zipCode:[* TO *])
Query fieldOccursQuery = new TermQuery(new Term(queryFieldName, "[* TO *]"));
我通过 QueryParser 创建了完全相同的(根据我的理解)查询,如下所示:
String querystr = "+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:*";
Query query = new QueryParser(Version.LUCENE_46, "title", LuceneServiceI.analyzer).parse(querystr);
我以同样的方式处理它们:
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
int max = reader.maxDoc();
TopScoreDocCollector collector = TopScoreDocCollector.create(max > 0 ? max : 1, true);
searcher.search(query, collector);
....
ScoreDoc[] hits = collector.topDocs().scoreDocs;
Map<Integer, Document> docMap = new TreeMap<Integer, Document>();
for (int i = 0; i < hits.length; i++) {
docMap.put(hits[i].doc, indexSearcher.doc(hits[i].doc));
}
不同的结果
在类似的索引上:stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<Request.zipCode:04103>
通过 QueryParser 的查询按预期交付一个文档
通过 BooleanQuery 的查询未提供 1 个预期文档
问题
- 是否有可能两个相同的查询提供不同的结果?为我的 BooleanQuery 等设置某些属性。
- 如何才能为 BooleanQuery 获得相同的所需结果?
- 我找不到任何关于性能差异的信息 (http://www.gossamer-threads.com/lists/lucene/java-user/144374)
【问题讨论】:
-
您尚未提供用于构造 BooleanQuery 的代码。你需要这样做才能让别人发现它的问题。不过,我确实想知道:这场比赛的最终目的是什么?在我看来它没有任何用处...
-
在构造 BooleanQuery 时是否可能使用了不同的分析器?我建议你在调试模式下检查解析器构造的查询,看看生成的结构是什么(从 toString() 开始)
-
@femtoRgon:谢谢,我添加了 BooleanQuery 的代码,我想我找到了导致不同结果的查询部分。由于这是遗留代码,我只想将查询更改为“如果该字段在文档本身中,则不接受带有 MUST_NOT 的文档”,所以我认为如果 MUST_NOT @987654329 存在 MatchAllQuery : @ 是唯一的单一标准。但我会检查它是否有意义。 @Yossi Vainshtein:谢谢,但 Analyzer 对他们来说是一样的:
StandardAnalyzer(Version.LUCENE_46)