Lucene 应用过滤器的顺序是什么。
真的有关系吗?如果您有 n 个独立的过滤器,则总体结果将是这些过滤器在彼此之上运行 AND 功能的产物。
是在查询之前还是之后?
严格来说,它们是齐头并进的。IndexSearcher.java
这是(Lucene 3.4版)的摘录
while (true) {
if (scorerDoc == filterDoc) {
// Check if scorer has exhausted, only before collecting.
if (scorerDoc == DocIdSetIterator.NO_MORE_DOCS) {
break;
}
collector.collect(scorerDoc);
filterDoc = filterIter.nextDoc();
scorerDoc = scorer.advance(filterDoc);
} else if (scorerDoc > filterDoc) {
filterDoc = filterIter.advance(scorerDoc);
} else {
scorerDoc = scorer.advance(filterDoc);
}
}
我如何理解这段代码是过滤器/记分器迭代器都向前推进,如果过滤器在记分器之前,则使用记分器,反之亦然。
何时使用一种技术而不是另一种?
在没有功能差异的情况下,上述两种技术之间是否存在性能差异?
我通常更喜欢在查询中添加额外的位,因为我相信这比查询后过滤更快(即使您使用QueryWrapperFilter
)。但是您需要确保客户无法进行 Lucene 查询字符串注入。在某些情况下,性能影响可以忽略不计,并且首选过滤器选项,因为过滤结果集比添加查询元素更容易。
当文档具有与之关联的用户权限并且用户在搜索结果中只能看到他/她的文档时,哪种技术更合适?
看到这个问题,之前已经讨论过了。