对于String类型的字段如果不指定类型会默认创建两种倒排索引
"itemSkuCodes": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
Text类型的倒排索引:
Elasticsearch会对其进行分词处理,然后创建这些词项的倒排索引以支持全文搜索。
Keyword类型的倒排索引:
Elasticsearch会将整个值作为一个整体来索引,不会进行分词处理。但是当存储值大于 ignore_above 设置的值时, Keyword会被截断 导致失效,当使用Elasticsearch中的"keyword"类型字段时,如果字段值的长度超过了"ignore_above"参数所设置的值,会导致倒排索引失效。这是因为"keyword"类型的字段会将整个字段值作为一个整体来索引,而不会对字段值进行分词处理。"ignore_above"参数用于限制字段值的长度,超过这个长度的字段值将被忽略,不会被索引。如果字段值的长度超过了"ignore_above"设置的值,Elasticsearch将无法正确处理这些超长的字段值,导致倒排索引失效。
所以模糊查询时 最好对设置字段类型设置text并设置keyword分词器,这样字段不会被分词,也不会超长被截取@Field(type = FieldType.Text, searchAnalyzer = "keyword", analyzer = "keyword")
关于检索时字段是否要携带 .keyword字段的问题
1 上面已经说过,String类型会默认创建text和keyword的倒排索引,所以这种情况下要使用精确查询或者使用keyword模糊查询, 需要在字段后拼接 .keyword
2 当string类型字段设置@Field(type = FieldType.Keyword) 或者 @Field(type = FieldType.text)等 时则不需要拼接 .keyword,否则查询不出数据
标签:段值,String,倒排,Spring,索引,Elasticsearch,keyword,类型 From: https://www.cnblogs.com/xiaoxiaoxingkong/p/18109044