【问题标题】:multi_match vs should match vs must query_string in ElasticSearchmulti_match vs should match vs must query_string in ElasticSearch
【发布时间】:2021-04-04 09:51:43
【问题描述】:

我在 ElasticSearch 中尝试了这些类型的查询,并想知道哪种类型最合适(最准确和最有效)。基本上,一个人可以有多个名称(数组)。姓名分为名、姓和中间名。有些人可以只有名字和姓氏。参数(输入)是全名(名字、姓氏和中间名在一个字符串中的组合)。添加了模糊逻辑。我注意到的一个区别是分数。

这是返回的第一个结果的分数。

  • 第一次查询:17.41911
  • 第二次查询:24.332222
  • 第三次查询:21.200104

这是否意味着第二个查询是该要求最准确的查询?

GET /person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "David Bill Gonzalo~",
            "fields": [
              "nameDetails.name.nameValue.firstName",
              "nameDetails.name.nameValue.surname",
              "nameDetails.name.nameValue.middleName"
            ]
          }
        }
      ]
    }
  }
}

GET /person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "nameDetails.name.nameValue.firstName": "David Bill Gonzalo~"
          }
        },
        {
          "match": {
            "nameDetails.name.nameValue.surname": "David Bill Gonzalo~"
          }
        },
        {
          "match": {
            "nameDetails.name.nameValue.middleName": "David Bill Gonzalo~"
          }
        }
      ]
    }
  }
}



GET /person/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fields": [
              "nameDetails.name.nameValue.firstName",
              "nameDetails.name.nameValue.surname",
              "nameDetails.name.nameValue.middleName"
            ],
            "query": "David Bill Gonzalo~"
          }
        }
      ]
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    第一次查询:

    多重匹配查询允许我们在多个字段上运行查询。它是匹配查询的扩展。

    在第一个查询中,您没有指定任何type 参数,因此默认情况下best_fields 被视为类型。 这会查找与查询匹配的所有文档,但 _score 仅从最佳字段计算。

    要了解更多关于多重匹配查询的类型,请参考documentation的这一部分。


    第二次查询:

    这是一个结合了bool/should 子句的布尔查询。 这里取每个匹配的 should 子句的分数来计算最终分数。


    第三次查询:

    在第三个查询中,query_string 针对多个字段运行。

    由于您没有指定任何type 参数,所以默认情况下best_fields 被认为是类型。 这会找到与查询匹配的所有文档,但_score 仅从最佳字段中计算。


    由于您使用相同的查询参数(即"David Bill Gonzalo~")查询多个字段,因此我认为您应该使用多重匹配查询。您可以使用具有不同选项的多重匹配查询,例如提升一个或多个字段,在多重匹配查询中添加type 参数等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-29
      • 2014-11-13
      • 2022-12-02
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多