match 一般要结合 text 类型一起使用
而 term 要结合 keyword 类型一起使用,这样才是有意义的
这里的理解有些人可能有误区,
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
这里的name并不是keyword, name.keyword才是keyword,是不是keyword要看其type
先总结几点:
- term查询要查询keyword字段
- term搜索词不会分词,也不会normalization化
- 源数据会normalization化
这样就会导致无法匹配,甚至你改成小写会有匹配的错视感.
text 类型在创建索引的时候会执行分词,分词过程有一个步骤叫 normalization 也叫文档归一化处理,在这个处理过程中,源数据字段会被统一时态、大小写等,具体还会执行哪些操作取决于你使用了哪个分词器,也就是说你的搜索词会保留大写,而源文档的索引数据会被转换为小写,注意这里说的是倒排索引会被转换为小写,而不是源数据,所以相当于 你用 John 去匹配了 john,所以无法命中
所以一般查询命中情况, 一定要注意分词器情况以及具体type如text和keyword
- keyword不会被分词,会保留源数据原样
- text会做文档标准化, 大小写,单复数,时态等等
- 搜索的分词器和源数据分词器是两回事,一定要注意这个区别
- term搜索词不分词,保留词源信息