【问题标题】:Elasticsearch query to find exact match on string field ( Without analyzing )Elasticsearch 查询以查找字符串字段的完全匹配(无需分析)
【发布时间】:2020-02-06 09:35:43
【问题描述】:

我们将类别存储在索引中,这是类别的映射

"name": {
     "type": "string",
     "analyzer": "autocomplete",
     "search_analyzer": "standard"
 }

现在,我们要对该字段进行精确搜索,这是我们正在尝试的查询

    {
      "from": "0",
      "size": "15",
      "query": {
        "filtered": {
          "query": {
            "bool": {
              "must": [
                {
                  "multi_match": {
                    "query": "a",
                    "type": "cross_fields",
                    "fields": [
                      "field1^20",
                      "filed1^12"
                    ]
                  }
                },
                {
                  "match": {
                    "category.name": "Arts and Culture"
                  }
                }
              ]
            }
          },
          "filter": {
            "bool": {
              "must": [
                {
                  "terms": {
                    "address_type": [
                      "val1",
                      "val2"
                    ]
                  }
                },
                {
                  "terms": {
                    "status": ["Active","Inactive"]
                  }
                }
              ]
            }
          }
        }
      }
    }

但它不完全匹配,我不想更改映射,因为我们也想在其他一些用例中进行部分搜索。

我只是想对查询中的一些修改进行精确匹配,是否有可能或有任何解决方法?

感谢您的帮助。

【问题讨论】:

    标签: elasticsearch elasticsearch-query elasticsearch-analyzers


    【解决方案1】:

    映射会影响数据的存储方式以及查询该字段的方式。您的类别字段(名为 name)字段被配置为用于自动完成而不是用于完全匹配搜索。因此,您必须更改映射以支持精确匹配搜索。

    但是,您可以在不更改当前字段的情况下执行此操作,只需通过将您的字段转换为多字段并添加一个支持精确匹配查询的字段来添加一个附加字段。映射sn-p:

    “名称”:{ “类型”:“字符串”, “分析器”:“自动完成”, "search_analyzer": "标准", “字段”:{ “生的”: { "类型" "字符串", “索引”:“未分析” } } } }

    注意:我注意到您使用的是旧版本的 Elasticsearch(类型“string”已替换为类型“text”(用于全文搜索)和“keyword”(用于完全匹配搜索)。我试图提出一个适用于旧版本 Elasticsearch 的映射,并希望它有效。如果不是,您需要提供您正在使用的 Elasticsearch 版本。

    修复映射后,您需要确保该字段也被填充。您可以通过执行以下请求来重新索引所有内容:

    POST <your_index_name>/_update_by_query
    

    在您的查询中,您需要进行如下搜索(精确匹配):

    "match": {
      "category.name.raw": "Arts and Culture"
    }
    

    对于部分搜索,您将继续使用category.name-字段(无后缀raw

    【讨论】:

    • 感谢您的详细回答,我有几个疑问,我是否需要在插入记录时也设置 category.name.raw 或者如果我设置 category.name 会自动填充?
    • 你能解释一下这部分“POST /_update_by_query”
    • 您需要确保新添加的字段也包含数据。无需担心您索引的新文档,但如果您的索引中已经有数据,则需要确保所有内容都被重新索引,以便同时填充新定义的字段。
    • 我假设我需要在两个字段(category.name 和 category.name.raw)中手动设置值。
    猜你喜欢
    • 2015-09-02
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多