如何使用Lucene的DistinctValuesCollector?

nwlls2ji  于 2023-01-02  发布在  Lucene
关注(0)|答案(1)|浏览(189)

我的目标是收集选择字段的不同值,并将其作为前端的过滤器选项。DistinctValuesCollector似乎是实现此目的的工具,但由于除了Javadoc之外,我还没有找到代码示例和文档,因此目前无法正确构建此收集器。有人能提供一个示例吗?
这是我的尝试,它没有提供所需的字段PROJEKTSTATUS.name的不同值。

val groupSelector = TermGroupSelector(PROJEKTSTATUS.name)
val searchGroup = SearchGroup<BytesRef>()
val valueSelector = TermGroupSelector(PROJEKTSTATUS.name)
val groups = mutableListOf(searchGroup)
val distinctValuesCollector = DistinctValuesCollector(groupSelector, groups, valueSelector)

该字段的索引如下所示:

document.add(TextField(PROJEKTSTATUS.name, aggregat.projektstatus, YES))
document.add(SortedDocValuesField(PROJEKTSTATUS.name, BytesRef(aggregat.projektstatus)))
shyt4zoc

shyt4zoc1#

多亏了@andrewJames给测试类的提示,我才弄明白:

fun IndexSearcher.collectFilterOptions(query: Query, field: String, topNGroups: Int = 128, mapper: Function<String?, String?> = Function { it }): Set<String?> {
    val firstPassGroupingCollector = FirstPassGroupingCollector(TermGroupSelector(field), Sort(), topNGroups)
    search(query, firstPassGroupingCollector)
    val topGroups = firstPassGroupingCollector.getTopGroups(0)
    val groupSelector = firstPassGroupingCollector.groupSelector
    val distinctValuesCollector = DistinctValuesCollector(groupSelector, topGroups, groupSelector)
    search(query, distinctValuesCollector)
    return distinctValuesCollector.groups.map { mapper.apply(it.groupValue.utf8ToString()) }.toSet()
}

相关问题