【发布时间】:2021-02-27 21:43:08
【问题描述】:
我有一个包含许多字段的文档,每个字段都包含短文本。
为了启用自定义提升并避免出现性能问题,我根据提升级别创建了这些字段的分组。示例:
"partName": {
"type": "text",
"copy_to": "fuzzyMatchFields_boost5"
},
这意味着要匹配partName,我将对fuzzyMatchFields_boost5 进行模糊匹配搜索,并将分数提高5 倍。查询类似于:
QueryBuilders.boolQuery()
.must(
QueryBuilders.multiMatchQuery(terms)
.field("exactMatchFields_boost5", 5f)
.field("exactMatchFields_boost2", 2f)
.field("fuzzyMatchFields_boost5", 5f)
.field("fuzzyMatchFields_boost4", 4f)
.field("fuzzyMatchFields_boost3", 3f)
.field("fuzzyMatchFields_boost2", 2f)
)
...
等等。 (我使用的是 Java 客户端,但这只是顺便说一句。)
这很好用,但现在我正在尝试添加匹配的突出显示。
问题是我不直接查询字段,而不是只查询它们的分组字段。因此,当我尝试突出显示时,我什么也得不到。
我已经发现我可以切换一个标志 (require_field_match) 并传递字段名称,而不管:
val highlightBuilder = HighlightBuilder()
.requireFieldMatch(false)
highlightFields.forEach { field ->
highlightBuilder.field(field)
}
这适用于一些 情况,但不适用于其他情况。我无法弄清楚为什么某些字段有效,为什么某些字段不有效。我什至不确定这是否应该工作。
一种可能的解决方案是专门为突出显示定义另一个查询(这在 Elasticsearch 中是可能的)。我担心的是性能,即。这显然需要我单独列出所有字段。我什至不明白为什么我需要一个查询,因为我认为对于任何匹配的文档,荧光笔只是单独处理它们。但也许事实并非如此。
这里最好的解决方案是什么?
【问题讨论】:
标签: elasticsearch