Elasticsearch中Text和Keyword类型的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch中Text和Keyword类型的区别相关的知识,希望对你有一定的参考价值。

参考技术A 很多刚开始学习 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/

以上是关于Elasticsearch中Text和Keyword类型的区别的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 08 keyword和text

Elasticsearch:Mapper Annotated Text Plugin 及其使用

Elasticsearch:Text vs. keyword - 它们之间的差异以及它们的行为方式

Elasticsearch:Text vs. Keyword - 它们之间的差异以及它们的行为方式

Elasticsearch:Mapper Annotated Text Plugin 及其使用

Elasticsearch:使用 Elasticsearch categorize_text 聚合对日志进行分类