如何在elasticsearch中实现区分大小写的搜索?

Bin*_*jan 7 elasticsearch

我的索引文档中有一个字段,我需要搜索案例敏感.我正在使用匹配查询来获取结果.我的数据文档的一个例子是:

{
"name" : "binoy",
"age" : 26,
"country": "India"
}
Run Code Online (Sandbox Code Playgroud)

现在当我提出以下查询时:

{
“query” : {
“match” : {
“name” : “Binoy"
}
}
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个匹配"binoy"对抗"Binoy".我希望搜索区分大小写.默认情况下,弹性搜索似乎与案例不敏感有关.如何在elasticsearch中使搜索区分大小写?

小智 5

这取决于您为 field 定义的映射name。如果您尚未定义任何映射,则 elasticsearch 会将其视为字符串并使用标准分析器(将标记小写)来生成标记。您的查询也将使用相同的分析器进行搜索,因此匹配是通过小写输入来完成的。这就是为什么“Binoy”匹配“binoy”

要解决它,您可以定义一个没有lowercase过滤器的自定义分析器并将其用于您的领域name。您可以定义分析器如下

"analyzer": {
                "casesensitive_text": {
                    "type":         "custom",
                    "tokenizer":    "standard",
                    "filter": ["stop", "porter_stem" ]
                }
            }
Run Code Online (Sandbox Code Playgroud)

您可以定义映射name如下

"name": {
    "type": "string", 
    "analyzer": "casesensitive_text"
}
Run Code Online (Sandbox Code Playgroud)

现在您可以在 上进行搜索name

注意:上面的分析器是为了举例。您可能需要根据您的需要更改它


Vin*_*han 5

在映射中,您可以将字段定义为not_analyzed。

curl -X PUT "http://localhost:9200/sample" -d '{
  "index": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  }
}'

echo
curl -X PUT "http://localhost:9200/sample/data/_mapping" -d '{
  "data": {
    "properties": {
      "name": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

现在,如果您可以进行普通索引和普通搜索,它将不会对其进行分析,并确保其提供不区分大小写的搜索。