【问题标题】:Lucene: getting the full collection documents as resultsLucene:获取完整的集合文档作为结果
【发布时间】:2011-03-01 12:14:39
【问题描述】:

当我在 Lucene (topDocs = searcher.search(booleanQuery, 220000);) 中执行查询时,我得到 170 次点击作为检索到的文档。这是正确的,但我希望在结果中包含完整的文档列表,即使分数非常低。

有没有办法强制 lucene 获取我所有集合的完整文档列表,而不仅仅是相关文档?

或者这意味着所有其他文档的分数都是 0 ?

谢谢

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    从 Lucene 3.x 开始,您可以使用TotalHitCountCollector 来检索查询的总命中数。然后,您可以使用总命中数检索查询的所有文档。小心没有任何命中的情况。

    TotalHitCountCollector collector = new TotalHitCountCollector();
    searcher.search(booleanQuery, collector);
    topDocs = searcher.search(booleanQuery, Math.max(1, collector.getTotalHits()));
    

    【讨论】:

      【解决方案2】:

      请指定q=*:*作为搜索词

      【讨论】:

        【解决方案3】:

        这个问题现在很老了,但我认为 OP 正在寻找的是 MatchAllDocsQuery 类。

        【讨论】:

          【解决方案4】:

          您可以在所有文档中添加一些字段,例如 test:1,然后搜索 [your_query] OR test:1

          【讨论】:

            【解决方案5】:

            如果您搜索“*”并允许在通配符查询中使用前导 *,它应该可以工作。 刚刚在 Luke 中对 501 文档索引进行了测试,该索引返回此查询的 501 结果。

            【讨论】:

            • 我其实并不想搜索 *,我还有我的查询,但我想获取所有文档以获取结果,即使分数很低。您可以告诉我,未检索到的文档的所有分数都正好=0,那么问题就解决了。我可以自己在底部添加它们。
            • 更新:查询最好是 booleanQuery + " OR *"。这样,与原始查询匹配的文档将获得比其他文档更高的分数,但其他文档的得分也 > 0 并因此被返回。
            • 示例:如果我查找 *beer*,我会得到一份分数为 1 的文档。如果我查找 *beer* or *,我会得到所有文档,其中顶级文档的分数为 1.4142,其他文档(这将在上一个查询中得分为 0)得分为 0,3536。
            • 我添加了以下几行,但我仍然只得到 172 个结果。 rest = new TermQuery(new Term("","")); booleanQuery.add(rest, BooleanClause.Occur.SHOULD);我也试过 new Term("title","*");其中 title 是一个现有字段,但它是相同的。
            • 我不确定 TermQuery 语法,因为我们手动构建查询字符串,然后使用 QueryParser,例如QueryParser.parse("content: beer OR content: *");您可能需要在查询解析器上调用 setAllowLeadingWildcard(true) 以允许这样做。您是否使用 BooleanClause.Occur.MUST 添加了其他查询词?如果是这样,这可能会阻止其他文档被退回。
            【解决方案6】:

            Lucene 不会根据分数进行任何过滤。如果一个查询有 170 个命中,则意味着只有 170 个文档与该查询匹配。其余文档不匹配,可以假定得分为 0。

            【讨论】:

            • 我明白了,您确定 100% 了解您的陈述吗? :) 我的意思是,这将是完美的,问题解决了。
            • 嗯,我仍然需要将它们包含在最终列表中。有没有办法获取所有剩余的集合文档并将它们添加到列表底部?
            • 是的,我确信这就是 Lucene 或任何其他全文搜索引擎的工作原理。
            • 有多种方法可以获取列表底部的剩余文档 - Thomas 在此问题的另一个答案中解释了一种完成它的方法。或者,您可以触发第二个查询,该查询是原始查询的否定查询,以获取与原始查询不匹配的所有文档。
            【解决方案7】:

            我有同样的问题,但在任何地方都找不到满意的答案。我读过你可以只使用 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;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-17
              • 2017-04-28
              • 2022-06-13
              • 1970-01-01
              • 1970-01-01
              • 2018-04-09
              相关资源
              最近更新 更多