字段类型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”:" *在金* "}}}
也能查到id为1的数据