elasticsearch 版本7 默认分词踩过的坑

背景

elasticsearch 版本

{
  "name" : "node-1",
  "cluster_name" : "enbrands-es",
  "cluster_uuid" : "-QNw671eR0CZHPGF9vJwhw",
  "version" : {
    "number" : "7.7.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
    "build_date" : "2020-05-12T02:01:37.602180Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

场景如下:

公司新建的互动标签,要求查询某段时间内,参与指定活动(集合)的会员信息
在这里插入图片描述

元数据:

{
	"_index": "interactive",
	"_type": "_doc",
	"_id": "6rW7i3QBa1MueVELzoxb",
	"_version": 1,
	"_score": 1,
	"_source": {
		"_class": "com.example.springelasticsearch.domain.Interactive",
		"interactive_type_num": "3",
		"interactive_act_num": "2",
		"interactive_type_list": ["签到"],
		"interactive_act_list": [{
				"join_time": "2010-09-12",
				"act_name": "三月签到"
			},
			{
				"join_time": "2010-09-08",
				"act_name": "二月签到"
			}
		],
		"first_interactive_time": "2020-09-14",
		"last_interactive_time": "2020-10-12",
		"interval_first_interactive": "1",
		"interval_last_interactive": "3"
	}
}

动作

动作语法

GET /tag_user/_search
{
	"query": {
		"bool": {
			"filter": [{
					"terms": {
						"act_name": [
							"二月签到",
							"三月签到"
						],
						"boost": 1.0
					}
				},
				{
					"range": {
						"join_time": {
							"from": "2020-09-02",
							"to": "2020-09-14",
							"include_lower": true,
							"include_upper": true,
							"boost": 1.0
						}
					}
				}
			],
			"adjust_pure_negative": true,
			"boost": 1.0
		}
	}
}

问题说明:

在执行的时候无法查到已有的数据,将terms中act_name去掉后,通过时间范围查询,可以查出来数据,但是加上terms语句块后,就查不出来了;

原因分析:

  • 猜测是因为es默认的分词器对汉语不太友好,他会将"三月签到" 分词成 【“三”,“月”,“签”,“到”】

在这里插入图片描述
这个时候有些猿友会提到ik分词器,可以专门对中文做分词,但是,来看下ik分词器对"三月签到"的分词效果
ik_smart分词效果
在这里插入图片描述

ik_max_word分词效果

在这里插入图片描述

很明显,ik分词器默认的词库是无法满足我们的分词需求,还可以使用自定义词库,但是我们的活动名是商家自定义的,没有规律,再说维护词库的成本比较高,
所以我们找到一种最直接的做法,就是不分词

解决方案:

不分词配置:
7.0版本之前可以使用 index属性设置

"index": "not_analyzed"  //不进行分词

但是7.0后,好像没有找到设置不分词的属性,但是可以使用如下方式达到不分词查询的效果, fieldname.keyword可以达到不分词的效果

{
   "terms": {
   	"act_name.keyword": [
   		"二月签到",
   		"三月签到"
   	],
   	"boost": 1.0
   }
}

效果展示

未使用act_name.keyword时,没有查到数据

使用act_name.keyword 时,查到了数据在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值