ES text/keyword match/term/模糊查询区别

发布时间 2023-03-22 21:11:24作者: 梦一水知音~

字段类型text的时候

首先"name": {“type”:“text”}的时候,我们存入一条数据叫 我在黄山 id为1

和另一条数据叫 黄山旅游 id为2

这时候ES通过IK分词后name的倒排索引会这样存储

name id
1
1
黄山 1
黄山 2
旅游 2

这个时候使用匹配查询(match),
{“query”:{“match”:{“name”:“我在黄山”}}}

会先将我在黄山分词为 我、在、黄山三个词,然后分别去倒排索引匹配。这时候会匹配出id为1和id为2的两行数据,

但是由于id为1的我在黄山数据匹配度更高,所以得分最高放在前面,而id为2的金融行业也会被查出来。

这个时候使用精确查询(term)

{“query”:{“term”:{“name”:“我在黄山”}}}

会一条都查不出来,因为一条索引都对不上。

但是如果使用 {“query”:{“term”:{“name”:“黄山”}}}

会查出来两条数据

字段类型keyword的时候

而如果使用keyword存储 我在黄山 id为1;黄山旅游 id为2。就会变为这样

name id
我在黄山 1
黄山旅游 2

这个时候使用match查询
{“query”:{“match”:{“name”:“我在黄山”}}}

由于分词缘故,会拿 我、在、黄山分别去匹配就会一条找不到

这个时候使用精确查询(term)

{“query”:{“term”:{“name”:“我在黄山”}}}

就只会查到id为1的数据

这个时候使用模糊查询

{“query”:{“wildcard”:{“name”:" *在黄* "}}}