ElasticSearch进阶检索

入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索

一、SearchAPI

ES 支持两种基本方式检索 :

1、一种是通过使用 REST request URI 发送搜索参数(uri+检索参数)

​ GET bank/_search 检索 bank 下所有信息,包括 type 和 docs

​ GET bank/_search?q=*&sort=account_number:asc 请求参数方式检索

2、另一种是通过使用 REST request body 来发送它们(uri+请求体)

  1. GET /bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "sort": [
  7. {
  8. "account_number": "asc"
  9. }
  10. ]
  11. }
  12. # query 查询条件
  13. # sort 排序条件

响应结果

响应结果解释:

took - 执行搜索的时间(毫秒)

time_out - 告诉我们搜索是否超时

_shards - 告诉我们多少个分片被搜索了,以及统计了成功/失败的搜索分片

hits - 搜索结果

hits.total - 搜索结果条数

hits.hits - 实际的搜索结果数组(默认为前 10 的文档)

sort - 结果的排序 key(键)(没有则按 score 排序)

score 和 max_score –相关性得分和最高得分(全文检索用)

二、Query DSL

1、基本语法格式

Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSLdomain-specific language 领域特

定语言)。这个被称为 Query DSL。

一个查询语句的典型结构:

  1. QUERY_NAME:{
  2. ARGUMENT:VALUE,
  3. ARGUMENT:VALUE,...
  4. }

如果针对于某个字段,那么它的结构如下:

  1. {
  2. QUERY_NAME:{
  3. FIELD_NAME:{
  4. ARGUMENT:VALUE,
  5. ARGUMENT:VALUE,...
  6. }
  7. }
  8. }

请求示例

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "from":0,
  7. "size":5,
  8. "sort": [
  9. {
  10. "balance": {
  11. "order": "desc"
  12. }
  13. }
  14. ]
  15. }
  16. #query 定义如何查询
  17. #match_all 查询类型【代表查询所有的所有】,es 中可以在 query 中组合非常多的查询类型完成复杂查询
  18. #除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。如 sort,size from+size 限定完成分页
  19. #sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

2、返回部分字段

_source:需要返回哪些字段写在数组中即可

3、match【匹配查询】

(1)对于基本数据类型的(非字符串),进行精确匹配

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "account_number": 10
  6. }
  7. }
  8. }
  9. #match 返回 account_number=10 的

(2)对于字符串类型的字段,进行全文检索,模糊匹配

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill"
  6. }
  7. }
  8. }
  9. #最终查询出 address 中包含 mill 单词的所有记录
  10. #match 当搜索字符串类型的时候,会进行全文检索,并且每条记录有相关性得分

(3)字符串,多个单词(分词+全文检索)

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill road"
  6. }
  7. }
  8. }
  9. #最终查询出 address 中包含 mill 或者 road 或者 mill road 的所有记录,并给出相关性得分(_score),也会按照这个评分排序

(4)精确匹配文本字符串

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address.keyword": " Mill road"
  6. }
  7. }
  8. }
  9. # 查找 address完全为Mill Street 的数据

4、match_phrase【短语匹配】

将需要匹配的值当成一个整体单词(不分词)进行检索

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match_phrase": {
  5. "address": "mill road"
  6. }
  7. }
  8. }
  9. #查出 address 中包含 mill road 的所有记录,并给出相关性得分

5、multi_match【多字段匹配】

  1. GET bank/_search
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "mill",
  6. "fields": [
  7. "city","address"
  8. ]
  9. }
  10. }
  11. }
  12. #检索 city 或 address 匹配包含 mill 的数据,会对查询条件分词

6、bool【复合查询】

bool 用来做复合查询: 复合语句可以合并任何其它查询语句,包括复合语句,复合语句之间可以互相嵌套,可以表达非常复杂的逻辑

(1)must:必须达到must所列举的所有条件

  1. GET bank/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {"match": {"firstname": "Forbes"}},
  7. {"match": {"gender": "M"}}
  8. ]
  9. }
  10. }
  11. }

(2)must_not 必须不是指定的情况

  1. GET bank/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {"match": {"firstname": "Forbes"}},
  7. {"match": {"gender": "M"}}
  8. ],
  9. "must_not": [
  10. {"match": {"lastname": "Wallace"}}
  11. ]
  12. }
  13. }
  14. }

(3)should:应该达到 should列举的条件

如果达到会增加相关文档的评分并不会改变 查询的结果。如果 query 中只有 should 且只有一种匹配规则,那么 should 的条件就会被作为默认匹配条件而去改变查询结果

  1. GET bank/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {"match": {"address": "mill"}},
  7. {"match": { "gender": "M" }}
  8. ],
  9. "should": [ {"match": { "address": "lane" }} ]
  10. }
  11. }
  12. }
  13. #应该匹配,匹配到能增加文档相关性得分,匹配不到也不会影响查询结果

7、filter【结果过滤】

不是所有的查询都需要计算相关性得分,仅用于 “filtering”(过滤)的文档。为了不计算分数 Elasticsearch 会自动检查场景并且优化查询的执行。

  1. GET bank/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {"match": {"address": "mill"}}
  7. ],
  8. "filter": [
  9. {"range": {
  10. "balance": {
  11. "gte": 10000,
  12. "lte": 20000
  13. }
  14. }}
  15. ]
  16. }
  17. }
  18. }
  19. #range范围查询,大于1000小于20000

8、term精确检索

避免使用 term 查询文本字段,默认情况下,Elasticsearch 会通过analysis分词将文本字段的值拆分为一部分,这使精确匹配文本字段的值变得困难。如果要查询文本字段值,请使用 match 查询代替。

和 match 一样,匹配某个属性的值。全文检索字段用 match其他非 text 字段匹配用 term

  1. GET bank/_search
  2. {
  3. "query": {
  4. "term": {
  5. "age": "20"
  6. }
  7. }
  8. }

9、Aggregation-执行聚合

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL聚合函数。

详细的介绍可以查看官网关于Aggregation的文档,下面提供几个示例来看一下聚合

https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations.html

(1)搜索address中包含 mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情

  1. GET bank/_search
  2. {
  3. "query": {
  4. "match": {
  5. "address": "mill"
  6. }
  7. },
  8. "aggs": {
  9. "group_by_state": {
  10. "terms": {
  11. "field": "age"
  12. }
  13. },
  14. "avg_age":{
  15. "avg": {
  16. "field": "age"
  17. }
  18. }
  19. },
  20. "size": 0
  21. }
  22. #size:0 不显示搜索数据
  23. #aggs:执行聚合。聚合语法如下:
  24. #"aggs": {
  25. "aggs_name 这次聚合的名字,方便展示在结果集中": {
  26. "AGG_TYPE 聚合的类型(avg,term,terms)": {
  27. "field": "age"
  28. }
  29. }
  30. }

(2)按照年龄聚合,并且请求这些年龄段的这些人的平均薪资

  1. GET bank/_search
  2. {
  3. "query": {"match_all": {}},
  4. "aggs": {
  5. "group_by_state": {
  6. "terms": {
  7. "field": "age"
  8. },
  9. "aggs": {
  10. "avg_age": {
  11. "avg": {
  12. "field": "age"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. #其实就是aggs里面又加了一个aggs,第二个aggs根据第一个aggs聚合后的结果在聚合

(3)查出所有年龄分布,并且这些年龄段中 性别为M 的平均薪资和 性别为F 的平均薪资以及这个年龄

段的总体平均薪资

  1. GET bank/_search
  2. {
  3. "query": {"match_all": {}},
  4. "aggs": {
  5. "age_avg":{
  6. "terms": {
  7. "field": "age",
  8. "size": 1000
  9. },
  10. "aggs": {
  11. "gender_avg": {
  12. "terms": {
  13. "field": "gender.keyword",
  14. "size": 10
  15. },
  16. "aggs": {
  17. "balance_avg": {
  18. "avg": {
  19. "field": "balance"
  20. }
  21. }
  22. }
  23. },
  24. "balance_avg": {
  25. "avg": {
  26. "field": "balance"
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }

ElasticSearch进阶检索的更多相关文章

  1. ElasticSearch 进阶

    目录 ElasticSearch 进阶 SearchAPI 检索信息 Query DSL 基本语法格式 查询-match 查询-match_phrase 查询-multi_match 查询-bool复 ...

  2. ElasticSearch入门检索

    前面简介说到 elsatic是通过RestFul API接口操作数据的,可以通过postman模拟接口请求测试一下 一._cat 1.GET /_cat/nodes:查看所有节点 2.GET /_ca ...

  3. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  4. 分布式搜索elasticsearch 文献检索索引 入门

    1.首先,例如,下面的数据被提交给ES该指数 {"number":32768,"singer":"杨坤","size": ...

  5. 搭建ElasticSearch+MongoDB检索系统

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  6. ES 19 - Elasticsearch的检索语法(_search API的使用)

    目录 1 Search API的基本用法 1.1 查询所有数据 1.2 响应信息说明 1.3 timeout超时机制 1.4 查询多索引和多类型中的数据 2 URI Search的用法 2.1 GET ...

  7. Elasticsearch高级检索之使用单个字母数字进行分词N-gram tokenizer(不区分大小写)【实战篇】

    一.前言 小编最近在做到一个检索相关的需求,要求按照一个字段的每个字母或者数字进行检索,如果是不设置分词规则的话,英文是按照单词来进行分词的. 小编以7.6.0版本做的功能哈,大家可以根据自己的版本去 ...

  8. elasticsearch 拼音检索能力研究

    gitchennan/elasticsearch-analysis-lc-pinyin 配置参数少,功能满足需求. 对应版本 elasticsearch2.3.2 对应 elasticsearch-a ...

  9. ElasticSearch 分页检索

    在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...

随机推荐

  1. 20201123 实验三《python程序设计》实验报告

    20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...

  2. win7旗舰版任务栏窗口不合并显示,鼠标移至窗口时可预览应用内容

    1.鼠标移至任务栏--右键--属性: 2.选择"当任务栏被占满时合并"或"从不合并",第一个选项更优: 3.右键桌面"计算机"的" ...

  3. Redis的主从数据一致性

    我们学习了 AOF 和 RDB,如果 Redis 发生了宕机,它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性.不过,即使用了这两种方法,也依然存在服 ...

  4. 【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集

    问题描述 近日好消息,如果是一个Java Spring Cloud的项目,想使用Azure Applicaiton Insights来收集日志及一些应用程序见解.但是有不愿意集成SDK来修改代码或者配 ...

  5. Pptx的多路径形状转为WPF的Path

    本文是将演示如何解析pptx文件的多路径的形状转换到WPF,绘制多个Shape的Path Shape Path 这是Pptx的[标注:弯曲曲线(无边框)]形状的OpenXml定义部分: <cal ...

  6. Hystrix 使用说明

    1.什么情况下会触发 fallback 方法 名字 描述 触发fallback EMIT 值传递 NO SUCCESS 执行完成,没有错误 NO FAILURE 执行抛出异常 YES TIMEOUT ...

  7. edraw max for mac 安装

    1.下载网址:https://xclient.info/s/edraw-max.html#versions 2.安装断网安装,直接打开 .dmg文件安装 3.按照阅读文件中的第二步,将opt.cell ...

  8. 『动善时』JMeter基础 — 55、使用非GUI模式运行JMeter(命令行模式)

    目录 1.JMeter的非GUI模式说明 2.为什么使用非GUI模式运行JMeter 3.使用非GUI模式运行JMeter (1)非GUI模式运行JMeter步骤 (2)其它参数说明 4.CLI模式运 ...

  9. Django基础007--filter&tag

    1.Django自带的过滤器filter def index(request): print('index...........') navs = '今天天气真好fdsfds!!!' title='& ...

  10. C语言:最大公约数和最小公倍数

    #include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...