es 中的.keyword

es 中的.keyword,第1张

ElasticSearch 5.0以后,string类型有重大变更,移除了string类型,string字段被拆分成两种新的数据类型: text用于全文搜索的,而keyword用于关键词搜索。

ElasticSearch字符串将默认被同时映射成text和keyword类型,将会自动创建下面的动态映射(dynamic mappings):

这就是造成部分字段还会自动生成一个与之对应的“.keyword”字段的原因。

Text:

分词,然后进行索引

支持模糊、精确查询

不支持聚合

keyword:

不进行分词,直接索引

支持模糊、精确查询

支持聚合

在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"}

///////****//////

1.text类型和keyword类型

一切文本类型的字符串可以定义成 “text”或“keyword”两种类型。区别在于,text类型会使用默认分词器分词,当然你也可以为他指定特定的分词器。如果定义成keyword类型,那么默认就不会对其进行分词。

es对字符串类型的mappong设定,会将其定义成text,同时为他定义一个叫做keyword的子字段。keyword只是他的名字,你也可以定义成kw。这个字段的类型是keyword(这是一个类型的关键字)

多字段类型情况下,你可以查询 title,也可以查询title.keyword查询类型为keyword的子字段

很多刚开始学习 Elasticsearch 的人经常会混淆Text 和Keyword数据类型。 它们之间的区别很简单,但非常关键。

它们之间的本质区别在于:对于 Text 类型,将文本存储到倒排索引之前,会使用分析器对其进行分析,而 Keyword 类型则不会分析。文档是否被分析过会影响其查询的结果。关于倒排索引和分析器的内容可以参考: https://www.jianshu.com/p/04d29098851a

如果将包含字符串的文档添加到 Elasticsearch,而之前没有定义字段的映射关系,那么 Elasticsearch 会自动创建一个包含 Text 和 Keyword 类型的动态映射。 即使它适用于动态映射,也建议在文档添加之前定义索引的映射关系,以节省空间并提高写入速度。

如:未定义mapping,直接添加文档内容,发现"message”的数据类型是 text ,“message.keyword"的数据类型是 keyword 。

返回mapping的结果

现在新建一个索引 text-vs-keyword ,并设置其mapping, keyword_field 字段设置为 keyword 类型, text_field 字段设置为 text 类型, text_and_keyword_mapping 为多字段类型,其本身为 text 类型,而 text_and_keyword_mapping.keyword 字段为 keyword 类型。

这两种字段类型在倒排索引中的存储方式不同,索引过程中的差异会影响Elasticsearch 进行查询的时间。

首先添加一条文档

添加后,索引中便会有一条文档

对于 keyword 类型,由于Elasticsearch不会使用分析器对其进行分析,所以你输入什么文本,索引就会按照原样进行保存。下图为文本在倒排索引中存储的样子。

对于 text 类型,Elasticsearch会先使用分析器对文本进行分析,再存储到倒排索引中。Elasticsearch默认使用标准分析器(standard analyzer),先对文本分词再转化为小写。关于标准分析器可以参考先前文章: https://www.jianshu.com/p/04d29098851a

标准分析器对文本进行分析后的结果

根据分析后的结果,下图为分词存储在倒排索引中的样子。

现在已经知道了 Text 和 Keyword 存储在倒排索引中的区别,接下来学习他们在查询中的区别。

查询分为两种查询

Match Query 和 Term Query 的区别与 Text 和 Keyword 的区别类似, Match Query 在查询时会对输入的关键词进行分析,而 Term Query 不会。

Elasticsearch 的查询原理是将查询的关键词与倒排索引中的词条进行匹配,查询的关键词与倒排索引中的词条必须完全相同视为匹配,否则不匹配。 这意味着在插入文档时是否进行分析和查询时是否进行分析将产生非常不同的结果。

不同的字段和不同的查询一共可以产生4种情况:以X代表不分析,O代表分析,左侧代表插入文档时是否分析,右侧代表查询时是否分析,则OX代表插入时分析,查询时不分析。

由于插入文档的 keyword 字段和 Term Query 查询时都不会进行分析,因此只有当文本完全匹配才会返回结果。

如果尝试文档中的一些词,由于不能与整篇文档相匹配,也不会返回结果。

这里有个疑问,查询关键词分析后的各个分词与倒排索引中的“The quick brown fox jumps over the lazy dog”不完全匹配,但为什么会产生结果呢?

这是因为我们在 Match Query 查询时使用的分析器不是标准分析器,Elasticsearch使用了关键词分析器(Keyword Analyzer),因此 Elasticsearch 在查询中没有任何改变。更多分析器可以参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html

查看Keyword Analyzer分析后的结果,发现并没有对搜索关键词进行分词。

当选择标准分词器时进行 Match Query 查询时将不会得到任何结果。

text 字段在文档插入时会对文本进行分析,得到若干个分词。

尝试两条查询语句,一条查询关键词为完整的句子,另一条只有一个单词。

两条语句都返回空结果:

将查询单词转换为小写试下,由于查询关键字"the"与倒排索引中的"the"正好匹配,所以会返回该条记录。

text 字段和Match Query查询都会进行分析。

下面尝试两条查询语句

这两条查询语句都返回了结果:

以下情况推荐使用 keyword 类型:

掌握 text 和 keyword 数据类型的工作原理是学习Elasticsearch的内容之一,这两者的区别似乎很简单,但非常重要。如果需要两种数据类型,则可以在创建映射时使用多字段功能。

https://codecurated.com/blog/elasticsearch-text-vs-keyword/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9513786.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存