ES的keyword的属性ignore_above 坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES的keyword的属性ignore_above 坑相关的知识,希望对你有一定的参考价值。

参考技术A 在es的5.x版本,keyword类型字段可以设置ignore_above ,表示最大的字段值长度,超出这个长度的字段将不会被索引,但是会存储。

设置message 的长度最长为20,超过20的不被索引,这里的不被索引是这个字段不被索引,但是其他字段有的话仍然被索引到。

下面造点数据

1)如果你做全部查询是可以查到超过ignore_above的doc的,如下图:

2)如果你用模糊匹配是搜索不到的(注意上面的数据最后带个1是21位下图是20位的)

3)用精确匹配前面20个仍然搜索不到

elasticsearch的keyword与text的区别

es2.*用户可忽略该文章。es 2.*版本里面是没有这两个字段!!!

当初接触es,最惊讶就是他的版本速度发布太快,这次主要讨论keyword与text的区别

在es 2.*版本里面是没有这两个字段,只有string字段。

5.*之后,把string字段设置为了过时字段,引入text,keyword字段

这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的

keyword:存储数据时候,不会分词建立索引

text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没用的,所以对于有些字段使用text则浪费了空间)。

"zuMaker":
    {"type":"keyword","index":"false"},
"zuName":
    {"type":"text","index":"true","boost":"5","analyzer":"ik_max_word","search_analyzer":"ik_max_word"},

现在我建立两个字段:

    zuMaker 族制作人 keyword类型

    zuName  族名称 text类型

我现在分别往两个字段里面存储数据,zuMaker存储 "张三李四"zuName存储 “墙体钢结构”、

其实在存储的过程中zuMaker 没有分词,只是存储了一个张三李四,而zuName字段存储倒排索引的时候进行了分词 墙体 和 钢结构或者是墙体 钢 结构。

这样在查询的时候,这两个字段的区别就表现出来了

如果精确查找zuName字段

   { "query": { "term": { "zuName": "墙体钢结构" } } }

会出现空数据,表示查不到数据,这是因为墙体钢结构这个值在存储的时候被分词了,倒排索引里面只有‘墙体’,‘钢结构‘,这两个词所以会出现查找为空的记录

        这种情况下的分词是存储数据时候的分词,还有一种分词是在你搜索的时候根据你的搜索参数进行分词后再进行搜索的。es提供了许多开箱即用的分析器analyzer,大家也可以去下载被人开发好的分词器然后安装在es的plugins下,然后在声明使用。在zuName这个字段我用的是ik的分词器,是一个大家基本都会用到的中文分词器,git地址为 https://github.com/medcl/elasticsearch-analysis-ik。

如果精确查找zuMakert字段

    { "query": { "term": { "zuMakert": "张三李四" } } }

这时候这条记录是存在的,因为keyword字段不会进行分词。

这查询是精确查询出现的结果,如果你使用分词查询,结果就会一样,但搜索结构的权重是不一样的。具体区别大家自己上级实验。

以上是关于ES的keyword的属性ignore_above 坑的主要内容,如果未能解决你的问题,请参考以下文章

kibana设置mapping

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

商城项目18_esMapping字段映射常用类型数据迁移ik分词器自定义分词器

商城项目18_esMapping字段映射常用类型数据迁移ik分词器自定义分词器

ElasticSearch03_Mapping字段映射常用类型数据迁移ik分词器自定义分词器

Elasticsearch(文档操作)--添加