【问题标题】:multi_match fuzzy query across multiple fields跨多个字段的multi_match模糊查询
【发布时间】:2017-09-13 08:37:52
【问题描述】:

我正在努力将“术语”与多个字段(或 _all 字段)匹配 我想对 cross_fields 进行模糊匹配,但不支持。 任何想法如何做到这一点或任何其他方式做到这一点?

query: {
  multi_match: {
    query: term,
    type: "cross_fields",
    fields: ['_all']
  }
}

在这里尝试解决方案时

ElasticSearch multi_match query over multiple fields with Fuzziness

我收到这个错误

[parsing_exception] 类型 [cross_fields] 不允许模糊,有 { line=1 & col=128 }

elasticsearch 5.0 版

编辑: 这是我正在构建的查询

bool: {
       must: [
             {
             fuzzy: {
                     _all: term
                     }
             },
             {
             fuzzy: {
                    "location.country": country
                    }
             },
             {
             fuzzy: {
                    "location.city": city
                    }
             }
             ]
      }

【问题讨论】:

  • 一个字段上的 cross_field 是无稽之谈。 _all 字段上的简单匹配就足够了。您将获得可用的模糊性。
  • @JulienTASSIN,我试过 _all: fullTerm 但它不工作。 fullTerm 是术语 + 国家 + 城市

标签: elasticsearch fuzzy-search


【解决方案1】:

cross_fields 通过在多个字段中搜索术语来工作。由于 cross_fields 不支持模糊性,因此您必须以不同的方式编写查询。

一种可能的方法是:使用 shoulds 实现您自己的“cross_fields”并在其中添加模糊性。

假设您的术语是:“term1 term2”,您可以按单词边界(Regex \b)拆分,那么它们应该是这种形式:

{
   {
    "query": {
        "bool": {
            "should": [{
                    "match": {
                        "field1": "term",
                        "fuzziness": 1
                    }
                },{
                    "match": {
                        "field1": "term",
                        "fuzziness": 1
                    }
                },{
                    "match": {
                        "field2": "term1",
                        "fuzziness": 1
                    }
                },{
                    "match": {
                        "field2": "term12",
                        "fuzziness": 1
                    }
                }
            ]
        }
    }
}
}

如果您有很多字段,这可能不是最优的,查询将成为术语和字段的笛卡尔积。

重要提示您正在使用 _all 字段,这是一个字段。所有其他字段都被索引到其中。也许你甚至不需要 cross_fields?

【讨论】:

  • 根据文档,即使只有一个匹配,应该查询也会匹配。 elastic.co/guide/en/elasticsearch/reference/current/… > 如果 bool 查询是一个过滤上下文或者既没有 must 也没有 filter,那么至少一个 should 查询必须匹配一个文档才能匹配 bool 查询。
猜你喜欢
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多