一、search template
搜索模板,search template,高级功能,就可以将我们的一些搜索进行模板
化,然后的话,每次执行这个搜索,就直接调用模板,给传入一些参数就可以了
1 template入门案例
简单定义参数并传递
GET /cars/_search/template { "source" : { "query" : { "match" : { "remark" : "{{kw}}" } }, "size" : "{{size}}" }, "params": { "kw" : "大众", "size" : 2 } }
toJson方式传递参数
GET cars/_search/template { "source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}", "params": { "parameter" : { "remark" : "大众" } } }
join方式传递参数
GET cars/_search/template { "source": { "query": { "match": { "remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}" } } }, "params": { "kw": [ "大众", "标致" ] } }
default value定义:
GET cars/_search/template { "source": { "query": { "range": { "price": { "gte": "{{start}}", "lte": "{{end}}{{^end}}200000{{/end}}" } } } }, "params": { "start": 100000 } }
2 记录template实现重复调用
可以使用Mustache语言作为搜索请求的预处理,它提供了模板,然后通过键值对
来替换模板中的变量。把脚本存储在本地磁盘中,默认的位置为:
elasticsearch\config\scripts,通过引用脚本名称进行使用
2.1 保存template到ES
POST _scripts/test { "script": { "lang": "mustache", "source": { "query": { "match": { "remark": "{{kw}}" } } } } }
2.2 调用template执行搜索
GET cars/_search/template { "id": "test", "params": { "kw": "大众" } }
2.3 查询已定义的template
GET _scripts/test
2.4 删除已定义的template
DELETE _scripts/test
二、suggest search(completion suggest)
suggest search(completion suggest):就是建议搜索或称为搜索建议,也可以叫做自动完成-auto completion。类似百度中的搜索联想提示功能。
ES实现suggest的时候,性能非常高,其构建的不是倒排索引,也不是正排索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以suggest search进行的前缀搜索提示,性能是非常高。
需要使用suggest的时候,必须在定义index时,为其mapping指定开启suggest。具体如下:
PUT /movie { "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", "fields": { "suggest": { "type": "completion", "analyzer": "ik_max_word" } } }, "content": { "type": "text", "analyzer": "ik_max_word" } } } } PUT /movie/_doc/1 { "title": "西游记电影系列", "content": "西游记之月光宝盒将与2021年进行......" } PUT /movie/_doc/2 { "title": "西游记文学系列", "content": "某知名网络小说作家已经完成了大话西游同名小说的出版" } PUT /movie/_doc/3 { "title": "西游记之大话西游手游", "content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中" }
suggest 搜索:
GET /movie/_search { "suggest": { "my‐suggest": { "prefix": "西游记", "completion": { "field": "title.suggest" } } } }
三、geo point - 地理位置搜索和聚合分析
ES支持地理位置的搜索和聚合分析,可实现在指定区域内搜索数据、搜索指定地点附近的数据、聚合分析指定地点附近的数据等操作。
ES中如果使用地理位置搜索的话,必须提供一个特殊的字段类型。GEO - geo_point。地理位置的坐标点。
1、定义geo point mapping
如果需要使用地址坐标,则需要定义一个指定的mapping类型。具体如下:
使用什么数据可以确定,地球上的一个具体的点?经纬度。
PUT /hotel_app { "mappings": { "properties": { "pin": { "type": "geo_point" }, "name": { "type": "text", "analyzer": "ik_max_word" } } } }