在使用es对某个字符串字段进行模糊查询的时候,可能因为该字段是text类型而搜索不到,因为text类型会将字符串进行分词之后存入索引,那么我们在模糊查询的时候其实是基于已分词的词组进行的模糊查询,这样会导致本来应该查询出来的数据有可能会查询不到。所以可以通过keyword来进行精确匹配,这里记录一下对es的text和keyword的理解和使用,有不足的欢迎码友指正。
一、text和keyword类型介绍
1.ES5.0及以后的版本取消了string
类型,将原先的string类型拆分为text
和keyword
两种类型。它们的区别在于text
会对字段进行分词处理而keyword
则不会进行分词。
也就是说如果字段是text
类型,存入的数据会先进行分词,然后将分完词的词组存入索引,而keyword
则不会进行分词,直接存储。
2.text
类型的数据被用来索引长文本,例如电子邮件主体部分或者一款产品的介绍,这些文本会被分析,在建立索引文档之前会被分词器进行分词,转化为词组。经过分词机制之后es允许检索到该文本切分而成的词语,但是text类型的数据不能用来过滤、排序和聚合等操作。
keyword
类型的数据可以满足电子邮箱地址、主机名、状态码、邮政编码和标签等数据的要求,不进行分词,常常被用来过滤、排序和聚合。
3.当我保存一个字符串字段时,es自动生成的该字段的mapping是text + keyword(es版本7.9.0)。
4.当我想要不分词进行查询的时候,可以加上.keyword
进行查询,比如:
"term": {
"name.keyword": "测试名称"
}
二、给text类型添加keyword
如果在创建index的时候给某个字段指定了类型text,但是之后又想给它追加上keyword以便按完整字符串搜索。可以通过PUT命令实现。
使用命令:
PUT /user_index/_mapping
{
"properties":{
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
添加前:
添加后:
使用GET /user_index/_mapping/
查看index的mapping