Mapping在Elasticsearch中是非常重要的一个概念。决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段等。
为什么要学习Mapping?
如果没有mapping所有text类型属性默认都使用standard分词器。所以如果希望使用IK分词就必须配置自定义mapping。
Elasticsearch中的数据类型有很多,在这里只介绍常用的数据类型。 只有text类型才能被分词。其他类型不允许。 文本(字符串):text 整数:byte、short、integer、long 浮点型:float、double 布尔类型:boolean 日期类型:date 数组类型:array {a:[]} 对象类型:object {a:{}} 不分词的字符串(关键字): keyword
true or false -> boolean 123 -> long 123.123 -> double 2018-01-01 -> date hello world -> text [] -> array {} -> object 在上述的自动mapping字段类型分配的时候,只有text类型的字段需要分词器。默认分词器是standard分词器。
可以通过命令查看已有index的mapping具体信息,语法如下: GET 索引名/_mapping
如:
GET test_index/_mapping
结果:
可以通过命令,在创建index和type的时候来定制mapping映射,也就是指定字段的类型和字段数据使用的分词器。 手工定制mapping时,只能新增mapping设置,不能对已有的mapping进行修改。 如:有索引a,其中有类型b,增加字段f1的mapping定义。后续可以增加字段f2的mapping定义,但是不能修改f1字段的mapping定义。 通常都是手工创建index,并进行各种定义。如:settings,mapping等。
4.1创建索引时指定mapping
举一个例子:
search的参数都是类似http请求头中的字符串参数提供搜索条件的。 GET [/index_name/type_name/]_search[?parameter_name=parameter_value&…]
2.1全搜索
timeout参数:是超时时长定义。代表每个节点上的每个shard执行搜索时最多耗时多久。不会影响响应的正常返回。只会影响返回响应中的数据数量。 如:索引a中,有10亿数据。存储在5个shard中,假设每个shard中2亿数据,执行全数据搜索的时候,需要耗时1000毫秒。定义timeout为10毫秒,代表的是shard执行10毫秒,搜索出多少数据,直接返回。 在商业项目中,是禁止全数据搜索的。必须指定搜索的索引,类型和关键字。如果没有指定索引或类型,则代表开发目的不明确,需要重新做用例分析。如果没有关键字,称为索引内全搜索,也叫魔鬼搜索。
2.2multi index搜索
**所谓的multi-index就是从多个index中搜索数据。**相对使用较少,只有在复合数据搜索的时候,可能出现。一般来说,如果真使用复合数据搜索,都会使用_all。
如:搜索引擎中的无条件搜索。(现在的应用中都被屏蔽了。使用的是默认搜索条件,执行数据搜索。 如: 电商中的搜索框默认值, 搜索引擎中的类别)
无条件搜索,在搜索应用中称为“魔鬼搜索”,代表的是,搜索引擎会执行全数据检索,效率极低,且对资源有非常高的压力。
示例:get test_search/test_type/_search?q=eage:26 对搜索条件为中文支持不友好。
2.3分页搜索
默认情况下,Elasticsearch搜索返回结果是10条数据。从第0条开始查询。 size和from是es中具有特定含义的属性名。 语法:
2.4+/-搜索
2.5排序
DSL - Domain Specified Language , 特殊领域的语言。 请求参数是请求体传递的。在Elasticsearch中,请求体的字符集默认为UTF-8。
3.1查询所有数据
3.2match search(项目搜索功能使用此命令)
全文检索。要求查询条件拆分后的任意词条与具体数据匹配就算搜索结果。
3.3phrase search
短语检索。要求查询条件必须和具体数据完全匹配才算搜索结果。其特征是: 1.对搜索条件进行拆词 2.把拆词当作一个整体,整体去索引(索引是存储内容被拆词后的结果)中匹配,必须严格匹配(存储内容拆词后是:北京,大兴,朝阳,条件拆词是:北京,朝阳。这种情况是不能被查询的,因为北京和朝阳之前还有大兴。)才能查询到
3.4range
3.5多条件复合搜索
在一个请求体中,有多个搜索条件,就是复合搜索。如:搜索数据,条件为部门名称是Sales Department,员工年龄在20到26之间,部门员工姓名叫张三。上述条件中,部门名称为可选条件,员工年龄必须满足要求,部门员工姓名为可选要求。这种多条件搜索就是复合搜索。
3.6排序
在Elasticsearch的搜索中,默认是使用相关度分数实现排序的。可以通过搜索语法实现定制化排序。
注意:在Elasticsearch中,如果使用text类型的字段作为排序依据,会有问题。Elasticsearch需要对text类型字段数据做分词处理。如果使用text类型字段做排序,Elasticsearch给出的排序结果未必友好,毕竟分词后,先使用哪一个单词做排序都是不合理的。所以Elasticsearch中默认情况下不允许使用text类型的字段做排序,如果需要使用字符串做结果排序,则可使用keyword类型字段作为排序依据,因为keyword字段不做分词处理。
3.7分页
DSL分页也是使用from和size实现的。