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

时间:2015-05-22 06:08:51

标签: elasticsearch

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

{
"name" : "binoy",
"age" : 26,
"country": "India"
}

现在我提出以下问题:

{
“query” : {
“match” : {
“name” : “Binoy"
}
}
}

它给了我“binoy”对抗“Binoy”的比赛。我希望搜索区分大小写。默认情况下,弹性搜索似乎与案例不敏感有关。如何在elasticsearch中使搜索区分大小写?

4 个答案:

答案 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"); }); 字段上完成。