一、搜索模板Search Template

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

类似于mysql的存储过程。

1.1 模版入门-固定参数模版

这种平常我们一般不会使用,不可重复利用

1.1.1 参数替换

# cars为索引库;template代表模版搜索
GET /cars/_search/template
{"source": {"query": {"match": {# 定义模版参数kw"remark": "{{kw}}"}},# 定义模版参数kw"size": "{{size}}"},# 传入模版参数"params": {"kw": "大众","size": 2}
}# 上述等同于
GET /cars/_search
{"query": {"match": {# 定义模版参数kw"remark": "大众"}},# 定义模版参数kw"size": 2
}

1.1.2 toJson方式传递参数

{{#toJson}}参数名称{{/toJson}}

因为中间使用了{{#toJson}}标签所以并不能为JSON所解析,所以需要转换成字符串形式。

GET cars/_search/template
{# {toJson}}相当于封闭符号;parameter相当于参数名称"source": "{ \"query\": { \"match\": {{#toJson}}parameter{{/toJson}} }}","params": {# 给parameter参数赋值"parameter" : {# 相当于 {"query": #            { "match": #                {"remarck":"大众"}#            }#        }"remark" : "大众"}}
}# 上述等同于
GET /cars/_search
{"query": {"match": {"remarck":"大众"}}
}

1.1.3 join方式传递参数

GET cars/_search/template
{"source": {"query": {"match": {# 参数值空格隔开"remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"}}},"params": {"kw": ["大众","标致"]}
}# 上述等同于
GET /cars/_search
{"query": {"match": {"remark":"大众 标致"}}
}

1.1.4 搜索模板的默认值设置 default value

可以对搜索模板进行一些默认值的设置,如{{^end}}200000表示如果end参数为空,默认值为200000

GET cars/_search/template
{"source": {"query": {"range": {"price": {"gte": "{{start}}","lte": "{{end}}{{^end}}200000{{/end}}"}}}},"params": {"start": 100000}
}

1.2 template实现重复调用

上述模版都是在创建时候就把参数固定了,不是我们常用的方式,我们希望在我们使用的时候再确定参数,从而根据我们传入的参数查询出我们期望的结果。

ES中实现了mustache语言。因此,搜索模板遵循脚本文档中描述的设置,然后通过键值对来替换模板中的变量。把脚本存储在本地磁盘中,默认的位置为:elasticsearch\config\scripts,通过引用脚本名称进行使用。

1.2.1 保存template到ES

# test是模版名称
POST _scripts/test
{"script": {# mustache语言"lang": "mustache","source": {"query": {"match": {"remark": "{{kw}}"}}}}
}

1.2.2 调用template执行搜索

GET cars/_search/template
{# 调用模版名称为test的模版"id": "test",# 传入参数kw"params": {"kw": "大众"}
}

1.2.3 查询已定义的template

# 查询test模版信息
GET _scripts/test

1.2.4 删除已定义的template

# 删除test模版
DELETE _scripts/test

二、搜索建议Suggest Search(Completion Suggest)

suggest search(completion suggest):就是建议搜索或称为搜索建议,也可以叫做自动完成-auto completion。类似百度中的搜索联想提示功能,在搜索框中查找字段,会很快的返回用户的可能希望得到的数据,由于用户每次输入都会发送查询请求,所以对查询速度要求很高,ES 中使用suggest search来对建议搜索进行优化。

ES实现suggest的时候,性能非常高,其构建的不是倒排索引,也不是正排索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以suggest search进行的前缀搜索提示,性能是非常高。

和之前的前缀搜索有点像,但是底层原理实现是不一样的,前缀搜索是基于倒排索引的的,而这个是基于内存实现的。

需要使用suggest的时候,必须在定义index时,为其mapping指定开启suggest。具体如下:

PUT /movie
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word",# 设置类似于子字段的一个字段suggest"fields": {"suggest": {# 类型设置为completion"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"}}}
}

使用suggest search会大大的提升搜索的速度,但是也会增大索引在内存中的占用。所以使用时要进行评估,在资源比较充裕时使用,或者出现性能问题的时候可以再考虑使用。

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

ES支持地理位置的搜索和聚合分析,可实现在指定区域内搜索数据、搜索指定地点附近的数据、聚合分析指定地点附近的数据等操作。

ES中如果使用地理位置搜索的话,必须提供一个特殊的字段类型: geo_point,地理位置的坐标点。

3.1 定义geo_point mapping

PUT /hotel_app
{"mappings": {"properties": {"pin": {"type": "geo_point"},"name": {"type": "text","analyzer": "ik_max_word"}}}
}

3.2 录入数据

新增一个基于geo point类型的数据,可以使用多种方式。

多种类型描述geo_point类型字段的时候,在搜索数据的时候,显示的格式和录入的格式是统一的。不影响搜索。

数据范围要求:纬度范围是-90~90之间,经度范围是-180~180之间。经纬度数据都是浮点数或数字串(数字组成的字符串),最大精度:小数点后7位。(常用小数点后6位即可。)

3.2.1 基于对象:latitude:纬度、longitude:经度

语义清晰,建议使用

PUT /hotel_app/_doc/1
{"name": "七天连锁酒店","pin": {"lat": 40.12,"lon": -71.34}
}

3.2.2 基于字符串:依次定义纬度、经度

不推荐使用

PUT /hotel_app/_doc/2
{"name": "维多利亚大酒店","pin" : "40.99, -70.81"
}

3.2.3 基于数组:依次定义经度、纬度

不推荐使用

PUT /hotel_app/_doc/3
{"name": " 红树林宾馆","pin" : [40, -73.81]
}

3.3 搜索指定区域范围内的数据

3.3.1 搜索矩形范围内的数据geo_bounding_box

矩形范围搜索:传入的top_left和bottom_right坐标点是有固定要求的。地图中以北作为top,南作为bottom,西作为left,东作为right。也就是top_left应该从西北向东南。Bottom_right应该从东南向西北。Top_left的纬度应该大于bottom_right的纬度,top_left的经度应该小于bottom_right的经度。(由两个点确定的矩形区域)

GET /hotel_app/_doc/_search
{"query": {"bool": {"must": [{"match_all": {}}],"filter": {"geo_bounding_box": {"pin": {"top_left": {"lat": 41.73,"lon": -74.1},"bottom_right": {"lat": 40.01,"lon": -70.12}}}}}}
}GET /hotel_app/_doc/_search
{"query": {"constant_score": {"filter": {"geo_bounding_box": {"pin": {"top_left": {"lat": -70,"lon": 39},"bottom_right": {"lat": -75,"lon": 41}}}}}}
}# 使用query方式查询
GET /hotel_app/_doc/_search
{"query": {"geo_bounding_box": {"pin": {"top_left": {"lat": 41.73,"lon": -74.1},"bottom_right": {"lat": 40.01,"lon": -70.12}}}}
}

3.3.2 搜索多边形范围内的数据geo_polygon

指定多个点,然后多个点连接组成的区域

GET /hotel_app/_doc/_search
{"query": {"bool": {"must": [{"match_all": {}}],"filter": {"geo_polygon": {"pin": {"points": [{"lat": 40.73,"lon": -74.1},{"lat": 40.01,"lon": -71.12},{"lat": 50.56,"lon": -90.58}]}}}}}
}

3.3.3 搜索某地点附近的数据geo_distance

这个搜索在项目中更加常用,类似附近搜索功能。

distance距离的单位,常用的有米(m)和千米(km)。

建议使用filter来过滤geo_point数据,因为geo_point数据相关度评分计算比较耗时,使用query来搜索geo_point数据效率相对会慢一些,建议使用filter。

GET /hotel_app/_doc/_search
{"query": {"bool": {"must": [{"match_all": {}}],"filter": {"geo_distance": {"distance": "200km","pin": {"lat": 40,"lon": -70}}}}}
}GET hotel_app/_search
{"query": {"geo_distance": {"distance": "90km","pin": {"lat": 40.55,"lon": -71.12}}}
}

3.3.4 统计某位置附近区域内的数据

聚合统计分别距离某位置80英里,80-300英里,300-1000英里范围内的数据数量。

geo_distance:代表以圆的形式做统计

origin:原始位置(以某一个点为圆心)

unit是距离单位,常用单位有:米(m),千米(km),英里(mi)

distance_type是统计算法:sloppy_arc默认算法、arc最高精度、plane最高效率

GET /hotel_app/_doc/_search
{"size": 0,"aggs": {"agg_by_pin": {"geo_distance": {"distance_type": "arc","field": "pin","origin": {"lat": 40,"lon": -70},"unit": "mi","ranges": [{"to": 80},{"from": 80,"to": 300},{"from": 300,"to": 1000}]}}}
}

ElasticSearch高级功能的使用(模版查询、地理位置查询等)相关推荐

  1. 【Elasticsearch】Elasticsearch高级调优方法论之——根治慢查询!

    1.概述 转载:Elasticsearch高级调优方法论之--根治慢查询! 1.引言 Elasticsearch是非常灵活且功能丰富的搜索引擎,它提供了许多不同查询数据的方法.在实战业务场景中,经常会 ...

  2. elasticsearch高级功能系列之completion suggest

    1.首先创建mapping,注意,在需要建议的field创建一个内部fields,suggest,类型是completion ,因为处理的是中文,所以加了ik中文分词器. {"mapping ...

  3. 七(7)探花功能-MongoDB地理位置查询-附近的人

    课程总结 1.探花功能 业务需求 执行过程 2.MongoDB的地理位置查询 地理位置查询的应用场景 查询案例 3.搜附近 上报地理位置 使用MongoDB搜索附近 一. 探花左划右滑 探花功能是将推 ...

  4. ElasticSearch高级 (Query DSL查询 bulk批量操作 导入数据 各种查询 实战技巧-优化比重 全量与增量数据同步)

    ElasticSearch高级 01-Query DSL(Domain Specific Language) 1 查询上下文 2 相关度评分:_score 3 元数据:_source 4 Query ...

  5. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  6. elasticsearch高级搜索功能多维度分享

    目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...

  7. Elasticsearch 搜索的高级功能学习

    在文章 Elasticsearch 入门学习 中介绍了 Elasticsearch 的基础概念以及一些常用的 API.这篇文章是继续对 Elasticsearch 中一些高级的搜索功能的学习和总结: ...

  8. elasticsearch高级查询进阶

    文章目录 前期准备 应用场景 1.constant_score查询-不考虑文档频率得分,与搜索关键字命中更多的返回结果 2.sort排序-分数相同情况下,按照指定价格域排序 3.不考虑文档频率TF/I ...

  9. ElasticSearch 高级查询语法

    ElasticSearch 高级查询语法Query DSL ES倒排索引 ES高级查询Query DSL 查询所有 match_all 分页查询form 深分页查询Scroll 指定字段排序sort ...

  10. Elasticsearch实战——地理位置查询

    Elasticsearch实战--地理位置查询 文章目录 Elasticsearch实战--地理位置查询 1. 半径查询(geo_distance query) 2. 指定矩形内的查询(geo_bou ...

最新文章

  1. php入门时间,php入门教程(二十一) php日期与时间函数
  2. 2010年5月21日 下雨了
  3. MaxAlertView 强大的弹框试图
  4. java.lang.math.trunc,java – JPA/Hibernate返回BigDecimal不长
  5. react文字滚动插件_【赠书】Preact(React)核心原理详解
  6. ManyToManyField的注意事项和如何建立索引
  7. Words For Today [2011-07-31]
  8. 绿盟安全扫描--检测到目标站点存在javascript框架库漏洞
  9. hping3安装使用
  10. 【笔记】感谢《梦幻模拟战》的Unity+Spine资源,同人模式开启
  11. 二进制、十六进制转换表
  12. 用matlab抽样定理验证,实验一 MATLAB验证抽样定理
  13. 可汗学院公开课——统计学笔记Task1
  14. 指定Web打印的打印机
  15. Scratch软件编程等级考试四级——20201219
  16. es多个字段排序_如何解决 ES 复杂聚合排序问题(嵌套桶排序)?
  17. 使用Vmware workstation出现权限不足
  18. 设计模式之命令模式(C++)
  19. 屏幕细密横条纹_叶一茜早秋造型,穿竖条纹风衣配横条纹裙,不仅不土意外显瘦时尚...
  20. pip is not an internal or external command how to solve pip 不是内部或外部命令 ------解决方法 顺便把pip升级

热门文章

  1. html collapse不重叠,html – border-collapse的组合:collapse和transform:translate
  2. 【Uplift】模拟数据篇
  3. 崩溃日志保存本地log,服务器上传
  4. 超信咋老是显示服务器不可用,超信创始人自述:微信是很强大 但我们敢叫板
  5. vn.py2-行情记录的使用
  6. python开发要学什么_运维为什么要学编程?编程为什么是Python?
  7. 什么是爬虫?--关于爬虫的简介
  8. HTML required
  9. AtCode ABC069 C-4-adjacent
  10. win gvim erlang 环境配置