【问题标题】:Elasticsearch highlight fields not in queryElasticsearch 突出显示不在查询中的字段
【发布时间】: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


    【解决方案1】:

    这成功了:

    Elasticsearch highlighting: "multi-match" query on custom "_all"-fields created with "copy_to"

    所以我对一些聚合字段有一个 n-gram 分析器,但对原始字段没有(因为我不想直接查询它们)。一旦我将分析器添加到突出显示的各个字段,就会开始正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-25
      • 2013-05-22
      • 1970-01-01
      • 2013-08-24
      • 2015-03-30
      • 2015-11-06
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多