本篇主要介绍一下搜索模板、映射模板、高亮搜索和地理位置的简单玩法。
标准搜索模板搜索模板search tempalte高级功能之一,可以将我们的一些搜索进行模板化,使用现有模板时传入指定的参数就可以了,避免编写重复代码。对常用的功能可以利用模板进行封装,使用时更简便。
这点类似于我们编程时的接口封装,将一些细节处理的东西封装成接口,供别人调用,使用者就只需要关注参数和响应结果就行,这样可以更好地提高代码复用率。
下面我们来看看最基本的几种用法
参数替换 GET /music/children/_search/template { "source": { "query": { "match": { "{{field}}":"{{value}}" } } }, "params": { "field":"name", "value":"bye-bye" } }该搜索模板编译后等同于:
GET /music/children/_search { "query": { "match": { "name":"bye-bye" } } } 使用Json格式的条件查询{{#toJson}}块内可以写稍微复杂一些的条件
GET /music/children/_search/template { "source": "{\"query\":{\"match\": {{#toJson}}condition{{/toJson}}}}", "params": { "condition": { "name":"bye-bye" } } }该搜索模板编译后等同于如下:
GET /music/children/_search { "query": { "match": { "name":"bye-bye" } } } join语法join内的参数names可以写多个:
GET /music/children/_search/template { "source": { "query": { "match": { "name": "{{#join delimiter=' '}}names{{/join delimiter=' '}}" } } }, "params": { "name":["gymbo","you are my sunshine","bye-bye"] } }该搜索模板编译后等同于如下:
GET /music/children/_search { "query": { "match": { "name":"gymbo you are my sunshine bye-bye" } } } 搜索模板的默认值设置可以对搜索模板进行一些默认值的设置,如{{^end}}500表示如果end参数为空,默认值为500
GET /music/children/_search/template { "source":{ "query":{ "range":{ "likes":{ "gte":"{{start}}", "lte":"{{end}}{{^end}}500{{/end}}" } } } }, "params": { "start":1, "end":300 } }该搜索模板编译后等同于:
GET /music/children/_search { "query": { "range": { "likes": { "gte": 1, "lte": 300 } } } } 条件判断在Mustache语言中,它没有if/else这样的判断,但是你可以定section来跳过它如果那个变量是false还是没有被定义
{{#param1}} "This section is skipped if param1 is null or false" {{/param1}}示例:创建mustache scripts对象
POST _scripts/condition { "script": { "lang": "mustache", "source": """ { "query": { "bool": { "must": { "match": { "name": "{{name}}" } }, "filter":{ {{#isLike}} "range":{ "likes":{ {{#start}} "gte":"{{start}}" {{#end}},{{/end}} {{/start}} {{#end}} "lte":"{{end}}" {{/end}} } } {{/isLike}} } } } } """ } }使用mustache template查询:
GET _search/template { "id": "condition", "params": { "name":"gymbo", "isLike":true, "start":1, "end":500 } }以上是常用的几种搜索模板介绍,如果在大型项目,并且配置了专门的Elasticsearch工程师,就经常会用一些通用的功能进行模板化,开发业务系统的童鞋只需要使用模板即可。
定制映射模板ES有自己的规则对插入的数据进行类型映射,如10,会自动映射成long类型,"10"会自动映射成text,还会自带一个keyword的内置field。方便是很方便,但有时候这些类型不是我们想要的,比如我们的整数值10,我们期望是这个integer类型,"10"我们希望是keyword类型,这时候我们可以预先定义一个模板,插入数据时,相关的field就按我们预先定义的规则进行匹配,决定这个field值的类型。
另外要声明一下,实际工作中编码规范一般严谨一些,所有的document都是预先定义好类型再执行数据插入的,哪怕是中途增加的field,也是先执行mapping命令,再插入数据的。
但自定义动态映射模板也需要了解一下。
默认的动态映射效果试着插入一条数据:
PUT /test_index/type/1 { "test_string":"hello kitty", "test_number":10 }查看mapping信息
GET /test_index/_mapping/type
响应如下:
{ "test_index": { "mappings": { "type": { "properties": { "test_number": { "type": "long" }, "test_string": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }默认的动态映射规则,可能不是我们想要的。
例如,我们希望数字类型的默认是integer类型,字符串默认是string类型,但是内置的field名字叫raw,不叫keyword,保留128个字符。
动态映射模板有两种方式:
根据新加入的field的默认的数据类型,来进行匹配,匹配某个预定义的模板
根据新加入的field的名字,去匹配预定义的名字,或者去匹配一个预定义的通配符,然后匹配上某个预定义的模板
根据数据类型进行匹配 PUT /test_index { "mappings": { "type": { "dynamic_templates": [ { "integers" : { "match_mapping_type": "long", "mapping": { "type":"integer" } } }, { "strings" : { "match_mapping_type": "string", "mapping": { "type":"text", "fields": { "raw": { "type": "keyword", "ignore_above": 128 } } } } } ] } } }