《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(3)

307 阅读3分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

视频课程:极客时间 -- Elasticsearch核心技术与实战-- 配套代码 GitHub

系列文章:

《Elasticsearch核心技术与实战》笔记 -- 第一章:概述

《Elasticsearch核心技术与实战》笔记 -- 第二章:安装上手

《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(1)

《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(2)

URI Search 详解

参考:大神都这么做,让 Kibana 搜索语法 query string 也能轻松上手

URI Search - 通过 URI query 实现搜索

GET  /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
	"profile": true
}
  • q 指定查询语句,使用 Query String Syntax
  • df 默认字段,不指定时,会对所有字段进行查询
  • sort 排序
  • from 和 size 用于分页
  • profile 可以查看查询是如何被执行的

Query String Syntax(1)

  • 指定字段 v.s 泛查询

    • q=title:2012 / q=2012

1、df查询.png 2、泛查询.png 3、指定字段.png

  • Term v.s Phrase

    • Beautiful Mind 等效于 Beautiful OR Mind
    • “Beautiful Mind”,等效于 Beautiful AND Mind。Phrase 查询,还要求前后顺序保持一致
  • 分组与引号

    • title:(Beautiful AND Mind)
    • title="Beautiful Mind"

4、Phrase查询.png 一、termQuery+泛查询.gif 一、分组bool查询.gif

Query String Syntax(2)

  • 布尔操作

    • AND / OR / NOT 或者 && / || / !
      • 必须大写
      • title:(matrix NOT reloaded)
  • 分组

    • +表示must
    • -表示 must_not
    • title:(+matrix - reloaded)

5、and分组查询.png 6、not分组查询.png 7、+号分组查询.png

Query String Syntax(3)

  • 范围查询

    • 区间表示:[]闭区间,{}开区间
      • year:{2010 TO 2018} 意为 2010 < year< 2018
      • year:[* TO 2018] 意为 year<=2018
  • 算法符号

    • year:>2010 意为查找2010年以后的电影(不包含2010年)
    • year:(>2010 AND <=2018) 意为查找2010年至2018年的电影(不包含2010年且包含2018年)
    • year:(%2B>2010 AND %2B<2018) 意为查找2010年至2018年的电影(不包含2011年且不包含2018年)

思考:在kibana中无法输入{}作为查询条件?

8、范围查询.png

Query String Syntax(4)

  • 通配符查询(通配符查询效率低,占用内存大,不建议使用,特别是放在最前面
    • ? 代表1个字符 ,* 代表0个或多个字符
      • title:mi?d
      • title:be*

9、通配符查询.png

  • 正则表达,这里并不支持所有的正则语法,使用的时候要注意查看官方文档说明。另外正则查询的内存压力也很大,要谨慎使用
    • title:/[bt]oy/

10、正则匹配.png

  • 模糊匹配与近似查询
    • title:befutifl~1
    • title:"lord rings"~2

11、模糊匹配.png

RequestBody 与 QueryDSL 简介

Request Body Search

  • 将查询语句通过 HTTP Request Body 发送给 ElasticSearch
  • Query DSL(Domain Specific Language 查询表达式)
  • 高阶语法只能通过 Request Body Search 来实现,建议使用 Request Body Search 实现查询功能

12、Request Body Search.png

  • ignore_unavailable :如果URL中一个或多个索引不存在的时候,ignore_unavailable 表示是否忽略这些索引,值为true和false;
  • profile: 是否打开性能分析;
  • match_all :匹配所有;

分页查询

  • From 从 0 开始,默认返回 10 个结果
  • 获取靠后的翻页成本较高

13、分页查询.png

排序

  • 最好在 “数字型” 与 “日期型” 字段上排序
  • 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值

14、排序.png

_source filtering

  • 过滤你要查询的字段信息

  • 如果 _source 没有存储,那就只返回匹配文档的元数据

  • _source 支持使用通配符

    _source["name*","desc*"]

脚本字段

  • 通过 painless 脚本,计算你所需要的新字段
  • 用例:订单中有不同的汇率,需要结合汇率对订单价格进行排序

15、脚本字段.png

使用查询表达式 - Match

  • match 默认使用 OR 连接查询

16、match默认查询.png

  • 添加 operator 属性,改变单词连接方式

17、match-operator.png

使用查询表达式 - Match_Phrase

match_phrase查询分析文本并根据分析的文本创建一个短语查询。match_phrase 会将检索关键词分词。match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的。

区别与match:match模糊匹配,先对输入进行分词,对分词后的结果进行查询,文档只要包含match查询条件的一部分就会被返回。

match_phrase 核心参数:slop 参数-Token之间的位置距离容差值

18、match_phrase查询.png

QueryString & SimpleQueryString 查询

Query String Query

  • 类似URI Query

19、query string.png

Simple Query String Query

20、simple query string.png