【问题标题】:Curious results using multi_match query in ElasticSearch在 ElasticSearch 中使用 multi_match 查询的奇怪结果
【发布时间】:2019-09-09 06:15:44
【问题描述】:

我正在使用 ElasticSearch 7.3。我正在使用“通用”搜索框对多个字段进行查询。例如。我希望用户只需输入搜索查询,而不是尝试填写特定字段的特定搜索框。

就我而言,为了降低复杂性,我只为这个用例搜索了几个选定的字段。比如说姓名、地址。

  // Target of copy_to of multiple fields
  address:
    type: text  

  // Target of copy_to of multiple fields
  name:
    type: text

我正在使用以下查询,

"query": {

    "bool": {
        "should": [{
            "multi_match": {
                "query": "chantz auburn",
                "fields": ["address", "name"],
                "type": "best_fields",
                "operator": "or"
            }
        }, {
            "multi_match": {
                "query": "chantz auburn",
                "fields": ["address", "name"],
                "type": "phrase_prefix",
                "operator": "or"
            }
        }],
        "minimum_should_match": "1"
    }

}

有了这个,我希望得到第一个点击是一个文档,

name: chantz lasts
address 9090 auburn drive KY

但我看到的却是,

name: chantz hasts
address 1122 castllight drive KY

name: chantz blasts
address 5656 suma pl CA

至少在前 10 个匹配项中基本上没有结果应该与两个字段中存在的术语匹配。即

name: chantz lasts
address 9090 auburn drive KY

如果我将查询的顺序从chantz auburn 切换到auburn chantz,那么我会得到类似的结果,但这次地址中包含auburn,但名称中没有chantz

我也试过cross_fields。不确定我在这里缺少什么?

【问题讨论】:

  • 您还可以包含来自搜索端点的explain 信息,这应该会让这里更加清楚。

标签: elasticsearch


【解决方案1】:

我不会在本地重现您的问题(但只有 3 个虚拟文档,我的相关性是歪的:p)

但这里有一些关于您的查询的提示:

1/ 您的phrase_prefix 多重匹配只有在查询的所有术语在同一字段中的顺序相同时才有效。例如,chantz las 将匹配 chantz lasts,但 chantz auburn 将不匹配任何文档,因为 chantz 在名称字段中,auburn 在地址字段中。所以不太确定它会按你的预期工作

2/ 如果您使用best_field 类型进行多重匹配,则得分将是“最匹配”字段的得分。因此,在您的情况下,如果 auburn 在您的索引中是一个非常常见的术语(如果有很多用户住在这里),那么最匹配的字段将是 name。因此,您的所有文档都将按名称字段的分数进行排序,并且由于您的所有示例文档都是 2 项长度的文档,因此它们都将具有相同的分数。我认为你所有的文件都有相同的分数。所以你需要使用cross_field 类型。

但是您的情况有些奇怪,因为cross_field 类型似乎不起作用,并且您说更改查询词顺序会更改您的结果列表,(这不应该发生在多重匹配上的标准映射/标记化询问)。那么您可以在问题中添加索引的映射和设置吗?我们需要他们帮助您并解决您的问题。

【讨论】:

  • 我实际上能够使用 cross_fields,好像我复制了我正在使用的应用程序生成的错误 ES 查询。
猜你喜欢
  • 2023-04-02
  • 2018-10-19
  • 2018-09-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
相关资源
最近更新 更多