持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
导语
Elasticsearch 是一个分布式的开源搜索和分析引擎,目前被广泛使用,本文记录了ES中的Mapping和分词机制。
Mapping&Types
Mapping其实就是定义一个文档以及其所包含的字段如何被存储和索引的方法,是建立的一种数据结构和相关配置的统称。比如,我们的文档中有一项是age,我们可以设置age的值是一个整形数,这是一种mapping,又或者我们可以设置age的值是字符串,也又是一种mapping。
在ES里,有着以下几种数据类型。如上述表格所示,左边是说一个什么样的数据,右边则是这种数据在ES里面的存储类型。
比如,一个字符串在es里面就可能被存储成string类型、或者text类型或者keyword类型,一个整数,在ES里面可能被存储成一个byte类型、或者short类型等等。所有这些映射规则,就称为mapping。
看到这里,大家可能会有疑问了,之前创建文档时从未指定过name是什么类型、age是什么类型、hobby是什么类型等等就很正常的进行了增删改查、搜索等操作。这就引入ES中一个动态映射的概念,我们来看一下。
Dynamic mapping
所谓动态映射,就是说,ES会根据我们输入的数据自动的建立mapping。
比如,对于一个布尔类型即true或false,ES会自动的映射为bool类型,对于一个整数,ES会自动映射成一个long型数据,浮点型则是自动映射为double类型,日期映射为date类型,字符串则映射为text类型。
Exact values vs. Full text
然后,我们再来看一下字符串的几个类型。
-
text 类型,当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。
-
keyword类型适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到。
总结
本文介绍了ES中的Dynamic Mapping机制和几种重要的数据类型,希望对您有所帮助。