如何关闭 easticsearch match_phrase 或 match_phrase_prefix 的自动完成功能?

How to turn off autocomplete for easticsearch match_phrase or match_phrase_prefix?

我有 ES 数据,其中包含类型 text 的字段 name。我必须按小写输入进行搜索,而实际名称可能使用大小写符号。我只需要准确的(但不区分大小写)名称。

我尝试使用 match_phrase(以及 match_phrase_prefix)。但它 returns 结果是自动完成的。点赞查询

"match_phrase": {
  "name": {
    "query": "apple iphone 11"
  }
}

returns两项:

{
"id": "547",
"name": "Apple iPhone 11",
}

{
"id": "253",
"name": "Apple iPhone 11 Pro",
}

我只需要带有 id: 547 的那个,即名称中没有多余符号的地方。

Elastcsearch 是否有工具来查找准确的名称,但以不区分大小写的形式且没有自动完成功能?

Does Elastcsearch have tools to find the exact name?

是的,Elasticsearch 为精确搜索提供了“关键词”类型。

in a case insensitive form and without autocomplete?

您可以使用带有小写过滤器的normalizer

  1. 在索引设置中添加规范器

PUT /so_index/

{
   "settings":{
      "analysis":{
         "normalizer":{
            "name_normalizer":{
               "type":"custom",
               "filter":[
                  "lowercase"
               ]
            }
         }
      }
   }
}
  1. 映射(您可以将名称用作精确匹配的关键字,也可以同时使用关键字和文本进行精确搜索和全文搜索)

PUT /so_index/_mapping

{
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "normalizer": "name_normalizer"
        }
      }
    }
  }
}
  1. 使用匹配或字词查询

获取/so_index/_search

{
  "query": {
    "match": {
      "name.keyword": "apple iphone 11"
    }
  }
}

我通过一个简单的脚本实现了我的需求:

"filter": [
    {
        "script": {
            "script": {
                "source": "doc[params.nameField].value != null && doc[params.nameField].value.equalsIgnoreCase(params.name)",
                "lang": "painless",
                "params": {
                    "name": "apple iphone 11",
                    "nameField": "name.exact"
                }
            },
            "boost": 1.0
        }
    }
]