我的索引文档中有一个字段,我需要在案例敏感的情况下进行搜索。我正在使用匹配查询来获取结果。 我的数据文档的一个例子是:
{
"name" : "binoy",
"age" : 26,
"country": "India"
}
现在我提出以下问题:
{
“query” : {
“match” : {
“name” : “Binoy"
}
}
}
它给了我“binoy”对抗“Binoy”的比赛。我希望搜索区分大小写。默认情况下,弹性搜索似乎与案例不敏感有关。如何在elasticsearch中使搜索区分大小写?
答案 0 :(得分: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"
}
}
}
}'
现在,如果您可以执行普通索引并进行常规搜索,则不会对其进行分析并确保它提供不区分大小写的搜索。
答案 1 :(得分:4)
让您的映射如下:
PUT /whatever
{
"settings": {
"analysis": {
"analyzer": {
"mine": {
"type": "custom",
"tokenizer": "standard"
}
}
}
},
"mappings": {
"type": {
"properties": {
"name": {
"type": "string",
"analyzer": "mine"
}
}
}
}
}
意思是,该自定义分析器没有lowercase
过滤器。
答案 2 :(得分:4)
这取决于您为字段lowercase
定义的映射。如果您尚未定义任何映射,则elasticsearch会将其视为字符串,并使用standard analyzer(标记较低的令牌)来生成令牌。您的查询也将使用相同的分析器进行搜索,因此通过降低输入的大小来完成匹配。这就是为什么“Binoy”匹配“binoy”
要解决此问题,您可以定义不带name
过滤器的自定义分析器,并将其用于您的字段"analyzer": {
"casesensitive_text": {
"type": "custom",
"tokenizer": "standard",
"filter": ["stop", "porter_stem" ]
}
}
。您可以将分析器定义如下
name
您可以定义"name": {
"type": "string",
"analyzer": "casesensitive_text"
}
的映射,如下所示
name
现在,您可以在{{1}}上进行搜索。
注意:上面的分析器是出于示例目的。您可能需要根据需要进行更改
答案 3 :(得分:0)
以下是适用于我的ElasticSearch 5.6的完整index template:
{
"template": "logstash-*",
"settings": {
"analysis" : {
"analyzer" : {
"case_sensitive" : {
"type" : "custom",
"tokenizer": "standard",
"filter": ["stop", "porter_stem" ]
}
}
},
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"fluentd": {
"properties": {
"message": {
"type": "text",
"fields": {
"case_sensitive": {
"type": "text",
"analyzer": "case_sensitive"
}
}
}
}
}
}
}
如您所见,日志来自FluentD并保存到基于时间的索引logstash-*
中。为了确保,我仍然可以在message
字段上执行通配符查询,我在该字段上放置了multi-field mapping。通配符/分析的查询可以在message
字段上完成,而message.case_sensitive
字段上的区分大小写的查询可以在 $('.js-upload-file-btn').on('click',function () {
$(".js-upload-file, .modal-backdrop").addClass("open");
});
// close all modal
$(document).on('click','.modal .close',function () {
$(".modal, .modal-backdrop").removeClass("open");
});
字段上完成。