【问题标题】:Find the keywords that matched the query in Elastic Search在 Elastic Search 中查找与查询匹配的关键字
【发布时间】:2020-08-12 09:43:10
【问题描述】:

我正在使用 Elastic Search 搜索多个索引。

当用户执行查询时,匹配项会分成 1 或 2 个产生结果的关键字。我希望能够知道每次点击的来源是哪个关键字。

因此,如果用户搜索“ventolin 治疗哮喘”,我想知道哪些命中是针对“ventolin”的,哪些是针对“哮喘”的。

也就是说,对于这个查询:

{
    'query': {
        'multi_match': {
            'query': 'ventolin for asthma',
            'fuzziness': 2,
            'prefix_length': 1,
            'type': 'best_fields',
            'fields': ['term*']
        }
    }
}

还有这些热门歌曲:

{
    ...
    'hits': {
        'total': {
            'value': 287,
            'relation': 'eq'
        },
        'max_score': 10.301256,
        'hits': [{
                '_index': 'normalized-term-mapping',
                '_type': '_doc',
                '_id': '194526',
                '_score': 10.301256,
                '_source': {
                    'term': 'Ventolin Evohaler',
                    ...
                }
            }, {
                '_index': 'normalized-term-mapping',
                '_type': '_doc',
                '_id': '194362',
                '_score': 8.529675,
                '_source': {
                    'term': 'Childhood Asthma',
                    ...
                }
            },
            ...
        ]
    }
}

我想将第一个匹配项与关键字 Ventolin 匹配,第二个匹配项与 Asthma 匹配。

注意:

  1. 我使用 fuzziness == 2,因此关键字可能与命中词不完全匹配
  2. 索引使用分析器(不是复杂的,但不是微不足道的)

我可以尝试编写代码以将术语与查询匹配,但这实际上意味着在代码中重新实现弹性分析,这不是一个很好的解决方案。

有没有办法从 Elastic 的原始查询中获取匹配的术语?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    是的,有一种方法可以使用 Highlight API 获取匹配的术语。

    您正在使用multi_match 查询,因此默认的突出显示选项可能对您来说已经足够了。您确实需要指定要突出显示的字段,如下所示:

    {
        'query': {
            'multi_match': {
                'query': 'ventolin for asthma',
                'fuzziness': 2,
                'prefix_length': 1,
                'type': 'best_fields',
                'fields': ['term*']
            }
        },
        'highlight': {
            'fields': {
                'term*': {}
            }
        }
    }
    

    但是,这不会返回匹配项的数组。相反,您将获得标记了现有匹配项的字段(通常使用 HTML,但您可以对其进行自定义)。如果需要,您可以使用该标记对单个匹配项进行后处理和隔离。

    【讨论】:

    • 这很好,但这只是告诉我结果中匹配了哪些术语。有没有办法知道它们与哪个原始查询词相关联?
    • 我不知道怎么做。您可以发送单独的查询,或覆盖用于在不同字段中突出显示的查询以使用不同的标记。但是对于给定的字段,我不知道您是否可以为不同的查询设置不同的标记。也许如果你指定它两次?一定要试一试。
    猜你喜欢
    • 2023-01-13
    • 2017-01-28
    • 1970-01-01
    • 2015-07-13
    • 2021-02-20
    • 2021-02-17
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多