当前位置: 首页 > news >正文

ElasticSearch高级功能

一、search template

搜索模板,search template,高级功能,就可以将我们的一些搜索进行模板
化,然后的话,每次执行这个搜索,就直接调用模板,给传入一些参数就可以了

1 template入门案例
简单定义参数并传递
1 GET /cars/_search/template
2 {
3 "source" : {
4 "query" : {
5 "match" : {
6 "remark" : "{{kw}}"
7 }
8 },
9 "size" : "{{size}}"
10 },
11 "params": {
12 "kw" : "大众",
13 "size" : 2
14 }
15 }
toJson方式传递参数
1 GET cars/_search/template
2 {
3 "source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}",
4 "params": {
5 "parameter" : {
6 "remark" : "大众"
7 }
8 }
9 }
join方式传递参数
1 GET cars/_search/template
2 {
3 "source" : {
4 "query" : {
5 "match" : {
6 "remark" : "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
7 }
8 }
9 },
10 "params": {
11 "kw" : ["大众", "标致"]
12 }
13 }
default value定义:
1 GET cars/_search/template
2 {
3 "source" : {
4 "query" : {
5 "range" : {
6 "price" : {
7 "gte" : "{{start}}",
8 "lte" : "{{end}}{{^end}}200000{{/end}}"
9 }
10 }
11 }
12 },
13 "params": {
14 "start" : 100000
15 }
16 }
2 记录template实现重复调用
可以使用Mustache语言作为搜索请求的预处理,它提供了模板,然后通过键值对
来替换模板中的变量。把脚本存储在本地磁盘中,默认的位置为:
elasticsearch\config\scripts,通过引用脚本名称进行使用
2.1 保存template到ES
1 POST _scripts/test
2 {
3 "script": {
4 "lang": "mustache",
5 "source": {
6 "query": {
7 "match" : {
8 "remark" : "{{kw}}"
9 }
10 }
11 }
12 }
13 }
2.2 调用template执行搜索
1 GET cars/_search/template
2 {
3 "id": "test",
4 "params": {
5 "kw": "大众"
6 }
7 }
2.3 查询已定义的template
1 GET _scripts/test
2.4 删除已定义的template
1 DELETE _scripts/test

二、suggest search(completion suggest)

suggest search(completion suggest):就是建议搜索或称为搜索建议,
也可以叫做自动完成-auto completion。类似百度中的搜索联想提示功能。
ES实现suggest的时候,性能非常高,其构建的不是倒排索引,也不是正排索
引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存
中,所以suggest search进行的前缀搜索提示,性能是非常高。

需要使用suggest的时候,必须在定义index时,为其mapping指定开启
suggest。具体如下:
1 PUT /movie
2 {
3 "mappings": {
4 "properties" : {
5 "title" : {
6 "type": "text",
7 "analyzer": "ik_max_word",
8 "fields": {
9 "suggest" : {
10 "type" : "completion",
11 "analyzer": "ik_max_word"
12 }
13 }
14 },
15 "content": {
16 "type": "text",
17 "analyzer": "ik_max_word"
18 }
19 }
20 }
21 }
22
23 PUT /movie/_doc/1
24 {
25 "title": "西游记电影系列",
26 "content": "西游记之月光宝盒将与2021年进行......"
27 }
28
29 PUT /movie/_doc/2
30 {
31 "title": "西游记文学系列",
32 "content": "某知名网络小说作家已经完成了大话西游同名小说的出版"
33 }
34
35 PUT /movie/_doc/3
36 {
37 "title": "西游记之大话西游手游",
38 "content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
39 }
40
suggest 搜索:
1 GET /movie/_search
2 {
3 "suggest": {
4 "my‐suggest" : {
5 "prefix" : "西游记",
6 "completion" : {
7 "field" : "title.suggest"
8 }
9 }
10 }
11 }

三、geo point - 地理位置搜索和聚合分析

ES支持地理位置的搜索和聚合分析,可实现在指定区域内搜索数据、搜索指
定地点附近的数据、聚合分析指定地点附近的数据等操作。
ES中如果使用地理位置搜索的话,必须提供一个特殊的字段类型。GEO -
geo_point。地理位置的坐标点。

1、定义geo point mapping
如果需要使用地址坐标,则需要定义一个指定的mapping类型。具体如下:
使用什么数据可以确定,地球上的一个具体的点?经纬度。
1 PUT /hotel_app
2 {
3 "mappings": {
4 "properties": {
5 "pin": {
6 "type": "geo_point"
7 },
8 "name" : {
9 "type" : "text",
10 "analyzer": "ik_max_word"
11 }
12 }
13 }
14 }
2、录入数据
新增一个基于geo point类型的数据,可以使用多种方式。
多种类型描述geo_point类型字段的时候,在搜索数据的时候,显示的格式
和录入的格式是统一的。不影响搜索。任何数据描述的geo_point类型字段,都
适用地理位置搜索。
数据范围要求:纬度范围是-90~90之间,经度范围是-180~180之间。经纬度
数据都是浮点数或数字串(数字组成的字符串),最大精度:小数点后7位。(常
用小数点后6位即可。)
基于对象:latitude:纬度、longitude:经度。语义清晰,建议使用。
1 PUT /hotel_app/_doc/1
2 {
3 "name": "七天连锁酒店",
4 "pin" : {
5 "lat" : 40.12,
6 "lon" : ‐71.34
7 }
8 }
基于字符串:依次定义纬度、经度。不推荐使用
1 PUT /hotel_app/_doc/2
2 {
3 "name": "维多利亚大酒店",
4 "pin" : "40.99, ‐70.81"
5 }
基于数组:依次定义经度、纬度。不推荐使用
1 PUT /hotel_app/_doc/3
2 {
3 "name": " 红树林宾馆",
4 "pin" : [40, ‐73.81]
5 }
3、搜索指定区域范围内的数据
总结:
矩形范围搜索:传入的top_left和bottom_right坐标点是有固定要求的。地
图中以北作为top,南作为bottom,西作为left,东作为right。也就是top_left
应该从西北向东南。Bottom_right应该从东南向西北。Top_left的纬度应该大于
bottom_right的纬度,top_left的经度应该小于bottom_right的经度。
多边形范围搜索:对传入的若干点的坐标顺序没有任何的要求。只要传入若
干地理位置坐标点,即可形成多边形。
搜索矩形范围内的数据
1 GET /hotel_app/_doc/_search
2 {
3 "query": {
4 "bool": {
5 "must": [
6 {
7 "match_all": {}
8 }
9 ],
10 "filter": {
11 "geo_bounding_box": {
12 "pin": {
13 "top_left" : {
14 "lat" : 41.73,
15 "lon" : ‐74.1
16 },
17 "bottom_right" : {
18 "lat" : 40.01,
19 "lon" : ‐70.12
20 }
21 }
22 }
23 }
24 }
25 }
26 }
27
28 GET /hotel_app/_doc/_search
29 {
30 "query": {
31 "constant_score": {
32 "filter": {
33 "geo_bounding_box": {
34 "pin": {
35 "top_left": {
36 "lat": ‐70,
37 "lon": 39
38 },
39 "bottom_right": {
40 "lat": ‐75,
41 "lon": 41
42 }
43 }
44 }
45 }
46 }
47 }
48 }
搜索多边形范围内的数据
1 GET /hotel_app/_doc/_search
2 {
3 "query": {
4 "bool": {
5 "must": [
6 {
7 "match_all": {}
8 }
9 ],
10 "filter": {
11 "geo_polygon": {
12 "pin": {
13 "points": [
14 {"lat" : 40.73, "lon" : ‐74.1},
15 {"lat" : 40.01, "lon" : ‐71.12},
16 {"lat" : 50.56, "lon" : ‐90.58}
17 ]
18 }
19 }
20 }
21 }
22 }
23 }
4、搜索某地点附近的数据
这个搜索在项目中更加常用。类似附近搜索功能。
Distance距离的单位,常用的有米(m)和千米(km)。
建议使用filter来过滤geo_point数据。因为geo_point数据相关度评分计算
比较耗时。使用query来搜索geo_point数据效率相对会慢一些。建议使用
filter。
1 GET /hotel_app/_doc/_search
2 {
3 "query": {
4 "bool": {
5 "must": [
6 {
7 "match_all": {}
8 }
9 ],
10 "filter": {
11 "geo_distance": {
12 "distance": "200km",
13 "pin": {
14 "lat": 40,
15 "lon": ‐70
16 }
17 }
18 }
19 }
20 }
21 }
22
23 GET hotel_app/_search
24 {
25 "query": {
26 "geo_distance" : {
27 "distance" : "90km",
28 "pin" : {
29 "lat" : 40.55,
30 "lon" : ‐71.12
31 }
32 }
33 }
34 }
5、统计某位置附近区域内的数据
聚合统计分别距离某位置80英里,300英里,1000英里范围内的数据数量。
其中unit是距离单位,常用单位有:米(m),千米(km),英里(mi)
distance_type是统计算法:sloppy_arc默认算法、arc最高精度、plane最高效率
1 GET /hotel_app/_doc/_search
2 {
3 "size": 0,
4 "aggs": {
5 "agg_by_pin" : {
6 "geo_distance": {
7 "distance_type": "arc",
8 "field": "pin",
9 "origin": {
10 "lat": 40,
11 "lon": ‐70
12 },
13 "unit": "mi",
14 "ranges": [
15 {
16 "to": 80
17 },
18 {
19 "from": 80,
20 "to": 300
21 },
22 {
23 "from": 300,
24 "to": 1000
25 }
26 ]
27 }
28 }
29 }
30 }

相关文章:

  • OpenUCX 库介绍与使用指南
  • 【信息系统项目管理师】第5章:信息系统工程 - 36个经典题目及详解
  • 生成对抗网络(Generative Adversarial Networks ,GAN)
  • Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败
  • 匿名函数lambda、STL与正则表达式
  • 最小二乘拟合曲线
  • bat——自动重启程序
  • 酒店行业冰与火:一边流拍,一边扩张
  • 第22篇:Linux系统的Switch字符设备驱动设计
  • 数据的模型分析及可视化
  • 【python机器学习】Day 25 异常处理
  • 日本动漫风格人像街拍Lr调色预设,手机滤镜PS+Lightroom预设下载!
  • 《Python星球日记》 第71天:命名实体识别(NER)与关系抽取
  • Java—封装、继承与多态
  • 通过Ollama读取模型
  • CSS 锚点滑动效果的技术
  • 【C/C++】高阶用法_笔记
  • Tensorflow2保存和加载模型
  • 【Redis】缓存穿透、缓存雪崩、缓存击穿
  • Java 异常处理之 BufferUnderflowException(BufferUnderflowException 概述、常见发生场景、避免策略)
  • 上海静安将发放七轮文旅消费券,住宿券最高满800元减250元
  • 坚持吃素,是不是就不会得高血脂了?
  • 欠债七十万后,一个乡镇驿站站长的中年心事
  • 商务部就开展加强战略矿产出口全链条管控工作应询答记者问
  • 第十二届警博会在京开幕:12个国家和地区835家企业参展
  • AI含量非常高,2025上海教育博览会将于本周五开幕