elasticsearch中忽略大小写模糊搜索实现

参考:https://www.phpmianshi.com/?id=255

背景

有时我们想cms搜索的时候更精准一点,可能会用到wildcard不分词的模糊搜索,但是不分词就有区分大小写搜索的问题

 

解决方案

1.在es查询时不区分大小写,可以让查询更方便,具体设置如下:

 

{
   "settings": {
       "analysis": {
           "analyzer": {
               "caseSensitive": {
                   "filter": "lowercase",
                   "type": "custom",
                   "tokenizer": "keyword"
               }
           }
       }
   },
   "mappings": {
       "personInfo": {
           "properties": {
               "userName": {
                   "type": "string",
                   "analyzer": "caseSensitive",
                   "search_analyzer": "caseSensitive"
               }
           }
       }
   }
}

设置完mappings后,在搜索的时候搜索的 userName 转成小写进行搜索

 

{
   "query": {
       "wildcard": {
           "userName": "*zhangsan*"
       }
   }
}

这样设置后就可以了。

 

2.当然也可以用should查询,先同时查询大写和小写的匹配

{
    "query": {
        "bool"{
            "must":[
                 {
                     "bool":{
                         "should":[
                             {
                                 "wildcard": {
                                     "userName": "*zhangsan*"
                                 }
                             },
                             {
                                 "wildcard": {
                                     "userName": "*ZHANGSAN*"
                                 }
                             }
                         ]
                     }
                 }   
            ]
        }
    }
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用Spring集成Elasticsearch7,可以通过设置索引的映射和查询使用的分析器来实现忽略大小写的功能。 首先,在创建索引,可以使用字段的映射设置来指定对应字段的分析器。通过设置分析器为"keyword_lowercase",可以将字段设置为忽略大小写。例如,以下代码片段演示了如何创建一个忽略大小写的索引: ```java CreateIndexRequest createIndexRequest = new CreateIndexRequest("my_index"); createIndexRequest.settings(Settings.builder() .put("index.analysis.analyzer.default.type", "custom") .put("index.analysis.analyzer.default.tokenizer", "keyword") .put("index.analysis.analyzer.default.filter", "lowercase") .build()); Mapping mapping = new Mapping.Builder() .field(new StringField("my_field") .analyzer("keyword_lowercase")) .build(); createIndexRequest.mapping(mapping); CreateIndexResponse response = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT); ``` 在查询,我们可以使用Spring Data Elasticsearch来构造查询请求。通过使用`QueryBuilders`类提供的`matchQuery`方法,并指定字段为忽略大小写的分析器,可以实现忽略大小写的查询。例如,以下代码片段演示了如何使用忽略大小写的方式进行查询: ```java QueryBuilder queryBuilder = QueryBuilders.matchQuery("my_field", "value") .analyzer("keyword_lowercase"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(queryBuilder); SearchRequest searchRequest = new SearchRequest("my_index"); searchRequest.source(searchSourceBuilder); SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); ``` 通过以上的设置和方法,我们可以在Spring集成Elasticsearch7实现忽略大小写的功能。这样,无论字段的大小写如何,都可以正确地进行索引和查询操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值