咨询一个 ES 的问题

2022-06-20 09:43:52 +08:00
 lslvxy

一个业务系统之前用的是 ES6.x 的,查询里的 filter 写的是

{
  terms:{
    eventName:[
    "xxx"
    ]
  }
}

然后换了个 ES7.x 的版本 这个查询就查不到数据了 要改成

{
  terms:{
    eventName.keyword:[
    "xxx"
    ]
  }
}

eventName 要改成 eventName.keyword 才有数据 请问这个查询怎么兼容,我翻了一下 es 的更新日志也没有发现相关的变更项

2408 次点击
所在节点    程序员
11 条回复
Oktfolio
2022-06-20 09:48:41 +08:00
text 类型没法精确匹配
sujin190
2022-06-20 09:53:08 +08:00
ES7.x 和 ES6.x 的数据结构不一样,想要一样,需要调整 es mapping 的配置吧
DonaldY
2022-06-20 10:06:42 +08:00
term 用于 keyword 。
zzl22100048
2022-06-20 10:10:47 +08:00
你们迁移数据的时候没有配置索引指定字段类型,es 动态 mapping ,string 是 text 类型,加上一个 keyword 的 field
zitionguo
2022-06-20 10:11:00 +08:00
重建索引吧,mapping 里边 eventName 由 text -> keyword
misaka19000
2022-06-20 10:34:13 +08:00
看 mapping
Morriaty
2022-06-20 11:03:24 +08:00
这个和 es version 没关系,可以看下 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html ,写的是 es 2.0 ,但道理一样
decken
2022-06-20 11:17:20 +08:00
感觉是换了版本之后 mapping 改了 贴上 2 次的 mapping 吧
Red998
2022-06-20 11:21:32 +08:00
matchQuery:会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。

termQuery:不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。
zmal
2022-06-20 11:26:55 +08:00
可能你用的是 ES 自动生成的 mapping ,没有自定义。无需分词的字符串字段改成 keyword 。
sadfQED2
2022-06-20 12:19:22 +08:00
目测你没有给这个字段加 keyword 类型的 field ,直接贴你的 mapping 上来吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX