【问题标题】:How to implement case sensitive search in elasticsearch?如何在elasticsearch中实现区分大小写的搜索?
【发布时间】:2015-08-04 01:13:52
【问题描述】:

我的索引文档中有一个字段,我需要在其中搜索时区分大小写。我正在使用匹配查询来获取结果。 我的数据文件的一个例子是:

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

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

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

它给了我一个“binoy”和“Binoy”的匹配。我希望搜索区分大小写。似乎默认情况下,elasticsearch 似乎不区分大小写。 elasticsearch如何让搜索区分大小写?

【问题讨论】:

  • "默认情况下,elasticsearch 似乎不区分大小写" 不,它遵循您配置映射的方式(尤其是该特定字段的分析器)。那么,您对该字段的映射如何?

标签: elasticsearch


【解决方案1】:

让你的映射像:

PUT /whatever
{
  "settings": {
    "analysis": {
      "analyzer": {
        "mine": {
          "type": "custom",
          "tokenizer": "standard"
        }
      }
    }
  },
  "mappings": {
    "type": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer": "mine"
        }
      }
    }
  }
}

意思是,该自定义分析器没有lowercase 过滤器。

【讨论】:

    【解决方案2】:

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

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

    "analyzer": {
                    "casesensitive_text": {
                        "type":         "custom",
                        "tokenizer":    "standard",
                        "filter": ["stop", "porter_stem" ]
                    }
                }
    

    您可以为name 定义映射,如下所示

    "name": {
        "type": "string", 
        "analyzer": "casesensitive_text"
    }
    

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

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

    【讨论】:

      【解决方案3】:

      在映射中,您可以将字段定义为 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"
            }
          }
        }
      }'
      

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

      【讨论】:

        【解决方案4】:

        这是适用于我的 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 字段上完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 2019-03-15
          • 2018-11-16
          • 1970-01-01
          • 1970-01-01
          • 2013-06-15
          • 1970-01-01
          相关资源
          最近更新 更多