Elasticsearch5.6如何让一个字段同时支持精确匹配和模糊检索

本文介绍如何在Elasticsearch中设置字段映射,使字段既支持精确匹配又支持模糊检索。通过具体示例展示了配置方法及实现精确匹配的Java代码。

需求:如何让ES的某个字段既能支持精确匹配查找,也能支持模糊检索?
方法:将字段的mapping设置为如下这种即可:

"properties": {
   
   
               "name": {
   
   
                  "type": "text",
                  "fields": {
   
   
                     "keyword": {
   
   
                        "type": "keyword",
                        "ignore_above": 256
                     }
                  }
               }

举个栗子

"properties": {
   
   
               "name": {
   
   
                 "analyzer": "ik_max_word",
				"store": true,
				"type": "text"
               }

上面这种配置:它只能分词匹配,做不到精确匹配。如我有两条数据
数据1:也无风雨也无晴
数据2:也无风雨也无晴2
搜索:业务风雨也无晴2
正确的结果是只返回数据2,但事实是两条数据它都返回了

怎么样才能让它只返回数据2呢?

再举个栗子

"properties": {
   
   
               "name": {
   
   
                  "type": "text",
                  "fields": {
   
   
                     "keyword": {
   
   
                        "type": "keyword",
                        "ignore_above": 256
                     }
                  }
               }

上面这种配置,在搜索业务风雨也无晴2的时候将只返回数据2,于是我们就 让字段同时支持精确匹配和模糊检索了。

如果索引已经添加,要更改字段类型映射请看这篇文章,不用写代码,直接postmain就可以了
https://blog.youkuaiyun.com/java_xxxx/article/details/108710260

java代码

如果java代码中对字符串按MultiMatchQueryBuilder的方式搜索,并且再添加进入boolTrem里,可以精确匹配,如搜索:“也无风雨也无晴”,结果:“也无风雨也无晴”、“也无风雨也无晴2”、“也啊无啊风啊雨啊也啊无啊晴2”
如果搜索"也无风雨也无晴2",结果:“也无风雨也无晴2”、“也啊无啊风啊雨啊也啊无啊晴2”

如果使用matchPhraseQuery,前提是索引不分词,搜索结果会比上面少了一个““也啊无啊风啊雨啊也啊无啊晴2””,达到精确匹配的效果

postFilterKeyword.should(QueryBuilders.matchPhraseQuery(fileNmae, item));
 MultiMatchQueryBuilder query = QueryBuilders.multiMatchQuery(item, locations).type(MultiMatchQueryBuilder.Type.PHRASE).slop(50);
                        postFilterKeyword.should(query);
 public static Page listArticleByEs(Page page, ArticlePub filter){
   
   
        Integer pageSize = page.getPageSize();
        Integer pageNumber = page.getPageNumber();
        Short status = filter.getArticleStatus();
        Short articleType = filter.getArticleType();
        String columnIds = filter.getColumnIds();
        Integer roleId = filter.getRoleId();
        Integer userType = filter.getUserType();
        Long siteId
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值