在最初创建索引mapping时,未指定index:not_analyzed

"exact_value": {
	"type":  "string"
 }	

这样导致的后果就是 exect_value字段不能使用es的terms语法来做匹配整个字段的查询,原因是terms要求分词器不要对字段分词,否则无法使用该语法

如果想要一个字符串像数字一样能被全词匹配(类似与sql中的等于),则需要在创建字段时指定一下,如
"exact_value": {
"type": "string",
"index": "not_analyzed"
}

如果问题已经存在,则会是让人挣扎的事情。
修改es文档字段的定义代价远比新增一个字段大得多,甚至需要将数据库重新同步到es中,中间还需要一个临时索引来过渡

  • 可以考虑在es中新增一个字段来做这件事。代价也比较大,时间长了,大家可能都会忘记加新字段的原因
  • 退而求其次,根据业务判断,是否可以放弃terms查询,改为 matchPhrase 语法来精确查询包含所有关键字的文档。当然,这存在前提:业务模型中,该字段不能存在包含当前数据的文档
    如 exact_value: 你好 ;如果另一个文档的exact_value:你好 xx;则这两个文档都会被匹配出来,如果exact_value的值是一个不含停词的字段且全是字母,则不会被分词器分为多个单词,基本可以使用matchPhrase代替terms查询。
posted on 2018-12-04 10:27  j.liu windliu  阅读(1449)  评论(0编辑  收藏  举报