keyword
字符串,精确匹配,不可分词,数据会作为完整字段进行匹配。也可以通过 wildcard 进行模糊查询
查询时,相当于 sql中的
=,如SQL:select * from 表 where name = '李雷'通过 wildcard 也可以进行模糊查询,如 SQL:
select * from 表 where name like '李雷%'
注意: ES中,类型 可以 影响 查询的方式。这与 MySQL 不同
ignore_above
创建 mapping 时,可以为字符串(专指 keyword 类型) 指定 ignore_above ,用来 限定字符长度。超过 ignore_above 的字符 会被存储,但不会被索引。
注意,是字符长度,一个英文字母是一个字符,一个汉字也是一个字符。
在动态生成的 mapping 中,keyword类型会被设置ignore_above: 256。
ignore_above 可以在创建 mapping 时指定。
测试
设置 message 的长度最长为20,超过20的不被索引,这里的不被索引是这个字段不被索引,但是该document中的其他字段仍然可以被索引到。
PUT my_index
{
"mappings" : {
"properties" : {
"message" : {
"type" : "keyword",
"ignore_above": 4
}
}
}
}
添加数据
POST /my_index/_doc
{ "message": "1234"}
POST /my_index/_doc
{ "message": "123456"}
查询全部
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
添加的记录全部能查询到
模糊查询
相当于执行 SQL:select * from my_index where message like '123%'
GET /my_index/_search
{
"query": {
"wildcard": {
"message": {
"value": "123*"
}
}
}
}
查询结果如下:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"message" : "1234"
}
}
]
}
}
只能查询出 "message" : "1234",超过4个字符的,不能被索引到
修改 ignore_above
PUT my_index/_mappings
{
"properties" : {
"message" : {
"type" : "keyword",
"ignore_above": 128
}
}
}
再次模糊查询
只能查询出 "message" : "1234",超过4个字符的,不能被索引到
结论
说明数据在添加时,已经做额外处理。之后即使修改数据类型,也还是查不到
新添加数据能查询到
添加新数据,是可以查询到的
添加新数据:
POST /my_index/_doc
{ "message": "1234567"}
再次模糊查询,可以查询到