这是我要解决的问题:
我使用a一起查询了所有索引,MultiReader
并且能够找出匹配来自哪个子索引ReaderUtil
。到目前为止,一切都很好,但这是问题所在:
为了执行(相当复杂的)合并逻辑,我需要来自所有子索引的文档,这些文档的任何键都必须与原始查询中的至少一个文档匹配。
这是一个例子:
索引1
1: {key: "foo", name: "Name A", something: 42}
2: {key: "bar", something: 2}
索引2
27: {key: "foo", something: 2}
索引3
102: {key: "foo", name: "Name B"}
103: {key: "bar", something: 999}
现在,如果我要查询name "Name A"
,那么我只会从索引1获得文档1。
我真正需要的是来自所有索引的所有文档,其中包含在该查询中被击中的键,而这些文档都是具有key的文档foo
:
基于对的原始查询name: "Name A"
。
我是否可以在没有2个单独查询的情况下实现此目标,第二个查询是OR
基于第一个查询中检索到的密钥的大量查询?有没有更有效的方法?
好的,这就是我的工作方式:
使用TermFirstPassGroupingCollector
with组字段id
,并使用实际的搜索查询(例如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);
...
}
}
问题解决了。确保您处理古怪像第一遍收集getTopGroups()
回来null
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句