【发布时间】:2011-03-01 12:14:39
【问题描述】:
当我在 Lucene (topDocs = searcher.search(booleanQuery, 220000);) 中执行查询时,我得到 170 次点击作为检索到的文档。这是正确的,但我希望在结果中包含完整的文档列表,即使分数非常低。
有没有办法强制 lucene 获取我所有集合的完整文档列表,而不仅仅是相关文档?
或者这意味着所有其他文档的分数都是 0 ?
谢谢
【问题讨论】:
当我在 Lucene (topDocs = searcher.search(booleanQuery, 220000);) 中执行查询时,我得到 170 次点击作为检索到的文档。这是正确的,但我希望在结果中包含完整的文档列表,即使分数非常低。
有没有办法强制 lucene 获取我所有集合的完整文档列表,而不仅仅是相关文档?
或者这意味着所有其他文档的分数都是 0 ?
谢谢
【问题讨论】:
从 Lucene 3.x 开始,您可以使用TotalHitCountCollector 来检索查询的总命中数。然后,您可以使用总命中数检索查询的所有文档。小心没有任何命中的情况。
TotalHitCountCollector collector = new TotalHitCountCollector();
searcher.search(booleanQuery, collector);
topDocs = searcher.search(booleanQuery, Math.max(1, collector.getTotalHits()));
【讨论】:
请指定q=*:*作为搜索词
【讨论】:
这个问题现在很老了,但我认为 OP 正在寻找的是 MatchAllDocsQuery 类。
【讨论】:
您可以在所有文档中添加一些字段,例如 test:1,然后搜索 [your_query] OR test:1。
【讨论】:
如果您搜索“*”并允许在通配符查询中使用前导 *,它应该可以工作。 刚刚在 Luke 中对 501 文档索引进行了测试,该索引返回此查询的 501 结果。
【讨论】:
*beer*,我会得到一份分数为 1 的文档。如果我查找 *beer* or *,我会得到所有文档,其中顶级文档的分数为 1.4142,其他文档(这将在上一个查询中得分为 0)得分为 0,3536。
Lucene 不会根据分数进行任何过滤。如果一个查询有 170 个命中,则意味着只有 170 个文档与该查询匹配。其余文档不匹配,可以假定得分为 0。
【讨论】:
我有同样的问题,但在任何地方都找不到满意的答案。我读过你可以只使用 IndexSearcher.search(query, Integer.MAX_VALUE),但这似乎很慢,所以我认为内存是为某个结果集分配的。我真的不知道为什么 Lucene 还没有提供获取整个结果集的方法,但这是我的解决方案...
TotalHitCollector collector = new TotalHitCollector();
indexSearcher.search(query, collector);
if (collector.getTotalHits() != 0) {
for (int i = 0; i < collector.getTotalHits(); i++) {
Document doc = indexSearcher.doc(collector.getDoc(i));
}
}
...和 TotalHitCollector 类...
public static class TotalHitCollector extends SimpleCollector {
private int base;
private final List<Integer> docs = new ArrayList<>();
public int getTotalHits() {
return docs.size();
}
public int getDoc(int i) {
return docs.get(i);
}
@Override
public void collect(int doc) {
doc += this.base;
docs.add(doc);
}
@Override
protected void doSetNextReader(LeafReaderContext context) {
this.base = context.docBase;
}
@Override
public ScoreMode scoreMode() {
return ScoreMode.COMPLETE_NO_SCORES;
}
}
【讨论】: