我正试图找出是否有办法在lucene中搜索,找到所有文档,其中至少有一个单词与某个特定单词不匹配。
E.g。我想找到除“test”之外至少有一个单词的所有文档。即“测试”可能存在或不存在但应至少有一个词而不是“测试”。在Lucene有办法做到这一点吗?
感谢, Purushotham
答案 0 :(得分:0)
Lucene可以做到这一点,但这不是一个好主意。
查询执行的性能受两个因素的影响:
高性能查询是可以与术语词典快速交叉的查询,并且只匹配几个术语,因此第二步不会花费太长时间。例如,为了禁止过于复杂的布尔查询,Lucene默认将子句数限制为1024.
使用TermQuery,术语词典相交需要(默认情况下)O(log(n))
操作(其中n是术语词典的大小)在内存中,然后在磁盘上进行一次随机访问以及最多16个术语的流式传输。另一个例子是blog entry from Lucene committer Mike McCandless,它描述了当第一步的暴力实现被更聪明的东西取代时,FuzzyQuery性能如何得到改善。
但是,您所描述的查询需要检查术语词典的每个术语,并且只关闭“测试”文档集中的文档!
您应该提供有关用例的更多详细信息,以便人们可以考虑更有效地解决您的问题。
答案 1 :(得分:0)
如果您需要具有单个否定条件的查询,则使用带有MatchAllDocsQuery的BooleanQuery和带有occurrence = MUST_NOT的TermQuery。无法另外强制执行存在约束(“必须包含至少一个未排除的术语”)。一旦检索到Lucene的结果,您就必须单独检查。根据Lucene返回的所有结果的有利结果的比例,这种解决方案可以从完全精细到性能灾难。