当前位置: 首页 > 知识库问答 >
问题:

我怎么能查询基于Lucene搜索结果的Lucene?

鄢开诚
2023-03-14

这是我想解决的问题:

  • 我有多个Lucene索引,每个索引包含相同数据结构的子集(它们具有相同的字段,但是字段可能存在于文档中,也可能不存在于某个索引中)
  • 索引之间共享一个全局标识符。也就是说,如果有4个索引,最多可能有4个文档共享一个密钥。
  • 我有一个单一的Lucene查询

我使用MultiReader一起查询所有索引,并且我能够使用ReaderUtil找出命中来自哪个子索引。到目前为止还不错,但问题是:

为了执行一个(相当复杂的)合并逻辑,我需要来自所有子索引的文档,其中的任何键至少与原始查询中的一个文档匹配。

这里有一个例子:

指标1

1:{key:“foo”,name:“name A”,something:42}

2:{键:“bar”,某物:2}

索引2

27:{key:“foo”,something:2}

指标3

102:{key:"foo", name:"Name B"}

103:{key:“bar”,something:999}

现在,如果我要对name"Name A"执行查询,则只能从索引1中获取文档1。

我实际上需要的是所有索引中的所有文档,这些文档都带有在该查询中被命中的键,这些文档都带有键foo

  • 索引1中的文档1

基于对名称的原始查询:“name A”

我能在没有两个单独查询的情况下实现这一点吗?第二个查询是基于第一个查询中检索到的密钥的大量?有没有更有效的方法?


共有1个答案

夏侯阳
2023-03-14

好的,我是这样做的:

使用带有组字段id术语FirstPassGroupingCollector,并使用实际搜索查询执行搜索(例如name:name a

TermFirstPassGroupingCollector firstPassCollector = new TermFirstPassGroupingCollector(
            "<grouping field name, e.g. id>",
            Sort.INDEXORDER,
            x);

searcher.search(query, firstPassCollector);

Collection<SearchGroup<String>> firstPassResult = firstPassCollector.getTopGroups(0, false)

然后,使用第二个过程收集器,并使用MatchAllDocsQuery收集所有组中的所有字段:

TermSecondPassGroupingCollector secondPassCollector = new TermSecondPassGroupingCollector(
            fieldNaming.getIdFieldName(),
            firstPassResult,
            Sort.INDEXORDER,
            Sort.INDEXORDER,
            maxDocsPerGroup,
            false,
            false,
            false);

searcher.search(new MatchAllDocsQuery(), secondPassCollector);

我现在可以遍历我的所有(匹配的)组,并获取每个组中的所有文档,无论它是否显式匹配:

for (GroupDocs groupDocs : documentGroups) {

    if (groupDocs.totalHits == 0) {
        continue;
    }

    for (int doc : groupDocs.scoreDocs) {

        Document document = reader.document(doc);
        ...
    }
}

问题解决了。确保你处理奇怪的事情,就像第一次通过收集器返回空代码一样。

 类似资料:
  • 我的任务是使用lucene在我们的产品表中搜索。我已经创建了一个索引,正在使用带有多个字段的QueryParser进行搜索,但结果不是我所需要的。我有一个存储为LM10的产品,但如果搜索词是LM 10,我希望能够找到它,但如果搜索词是Fred LM10或Fred LM 10,它也必须能够匹配。你知道我如何在Lucene做到这一点吗。 提前谢谢

  • 问题内容: 我有一个查询,用于查找按位置排序的结果。结果还必须考虑增值税,因此这也在查询中。不幸的是,该查询在未缓存时可能需要4秒钟以上的时间才能运行。谁能发现任何明显的问题或建议我做些什么来改善它? 只是为了澄清查询中正在发生的事情: 计算的距离是使用经/纬度的欧几里得距离 当包含增值税时,incvat字段用于显示价格 WHEN / THEN语句用于将价格0置于最底端 查询: 问题答案: 您可以

  • 首先,对不起我的英语不好! 我是Lucene图书馆的新人(从上周三开始),我试图了解如何根据找到的术语获得匹配文档的最佳相关性级别。 我使用Lucene 4.10。0(无Solr) 我能够索引/搜索英语/阿拉伯语文本,以及支持这些文本的点击突出显示。 现在我有一个问题与搜索结果的相关性。 如果我在三个文档中搜索“穆罕默德·奥马尔”: 我得到同样的分数为这3文档。 看起来Lucene忽略了单词顺序,

  • 我试图用一个词作为查询来查找匹配项,但它似乎找不到。我正在使用标准分析仪,但找不到准确的结果。 我的索引文档是: 如果使用通配符查询: 它会返回内容:“敏捷的棕色狐狸跳过懒惰的狗” 如果使用术语查询: 它会返回内容:“敏捷的棕色狐狸跳过懒惰的狗” 现在,我想用“狐狸”作为我的新名词 但是我不知道哪个是正确的查询,或者如何做。我已经尝试了QueryParser、TermQuery和MultiPhra

  • 我试图使用Lucene索引进行查询,但得到的结果为空,日志中出现以下错误, 我正在使用RDB DocumentStore,我已经检查了索引和节点是在节点表中创建的。 任何人都可以分享一些关于如何创建Lucene索引的示例代码吗?

  • 我使用这个分析器创建了一个模型: 我实现了如下所示的查询。我得到了所有预期的结果,除了像“A.B.C”这样的结果。我做错了什么?我哪里误解了事情? 我的代码基于以下资源: