跨多个字段的Elasticsearch查询带有模糊性的术语

时间:2019-10-03 08:33:00

标签: elasticsearch

我正在构建一个业务搜索引擎,以根据用户输入的查询来搜索业务联系方式。用于企业的信息以以下形式存储在Elasticsearch索引中:

"_source" : {
          "id" : 53,
          "name" : "Judge Pouros",
          "email" : "roob.alberto@example.com",
          "phone" : "+1-783-850-2127",
          "created_at" : "02/10/2019 16:30",
          "updated_at" : "02/10/2019 16:30",
          "travel_agencies" : [
            {
              "id" : 1234,
              "abta" : "A1234",
              "name" : "The Example Travel Agency",
              "address_id" : 27,
              "email" : "zwillms@example.info",
              "comm_rate" : 14.0,
              "travel_agency_type_id" : 1,
              "address" : {
                "id" : 27,
                "line_1" : "Flat 52",
                "line_2" : "Flat 82i\nKaren Circles",
                "town" : "Kimberlyside",
                "county" : "Renfrewshire",
                "country_id" : 189,
                "postcode" : "SM3 9QR",
                "created_at" : "2019-10-02 16:31:01",
                "updated_at" : "2019-10-02 16:31:01",
                "country" : {
                  "id" : 189,
                  "code" : "MF",
                  "name" : "Saint Martin (French part)",
                  "translations" : [
                    {
                      "id" : 189,
                      "locale" : "en",
                      "country_id" : 189,
                      "name" : "Saint Martin (French part)"
                    }
                  ]
                }
              }
            }

假设某客户正在搜索“示例旅行伦弗鲁郡”。我希望以上结果会返回。我目前正在使用以下查询字符串:

{
    "query": {
        "query_string": {
            "query": "*example*travel*renfrewshire*"
        }
    }
}

但是没有返回结果。我想做的是查找包含用户查询中的术语且模糊不清的文档,以防拼写错误。

我曾经考虑过对特定术语进行模糊匹配,但是我不知道用户查询的术语可能匹配,因此我需要对照所有术语进行检查。

是否有一个更简单的查询可以做到这一点?

1 个答案:

答案 0 :(得分:2)

由于您要搜索整个文档,因此建议使用multi match query

这将在提供的字段上执行全文搜索。

您的查询将如下所示:

{
  "query": {
    "multi_match" : {
      "query" : "example travel renfrewshire",
      "fields" : [ * ] 
    }
  }
}

您还可以在match / multi_match查询中定义模糊性。

为此查看fuzziness documentation

编辑:

如文档中所述:

  

如果未提供任何字段,则multi_match查询默认为index.query.default_field索引设置,而默认设置为*。 *提取映射中符合词条查询条件的所有字段,并过滤元数据字段。然后将所有提取的字段组合起来以构建查询。

您甚至不必定义字段设置,因为它的默认值为*(均符合条件)。