这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
视频课程:极客时间 -- 《Elasticsearch核心技术与实战》-- 配套代码 GitHub
系列文章:
《Elasticsearch核心技术与实战》笔记 -- 第一章:概述
《Elasticsearch核心技术与实战》笔记 -- 第二章:安装上手
《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(1)
《Elasticsearch核心技术与实战》笔记 -- 第三章:ElasticSearch 入门(2)
URI Search 详解
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
-
Term v.s Phrase
- Beautiful Mind 等效于 Beautiful OR Mind
- “Beautiful Mind”,等效于 Beautiful AND Mind。Phrase 查询,还要求前后顺序保持一致
-
分组与引号
- title:(Beautiful AND Mind)
- title="Beautiful Mind"
Query String Syntax(2)
-
布尔操作
- AND / OR / NOT 或者 && / || / !
- 必须大写
- title:(matrix NOT reloaded)
- AND / OR / NOT 或者 && / || / !
-
分组
- +表示must
- -表示 must_not
- title:(+matrix - reloaded)
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中无法输入{}作为查询条件?
Query String Syntax(4)
- 通配符查询(通配符查询效率低,占用内存大,不建议使用,特别是放在最前面
- ? 代表1个字符 ,* 代表0个或多个字符
- title:mi?d
- title:be*
- ? 代表1个字符 ,* 代表0个或多个字符
- 正则表达,这里并不支持所有的正则语法,使用的时候要注意查看官方文档说明。另外正则查询的内存压力也很大,要谨慎使用
- title:/[bt]oy/
- 模糊匹配与近似查询
- title:befutifl~1
- title:"lord rings"~2
RequestBody 与 QueryDSL 简介
Request Body Search
- 将查询语句通过 HTTP Request Body 发送给 ElasticSearch
- Query DSL(Domain Specific Language 查询表达式)
- 高阶语法只能通过 Request Body Search 来实现,建议使用 Request Body Search 实现查询功能
ignore_unavailable
:如果URL中一个或多个索引不存在的时候,ignore_unavailable
表示是否忽略这些索引,值为true和false;profile
: 是否打开性能分析;match_all
:匹配所有;
分页查询
- From 从 0 开始,默认返回 10 个结果
- 获取靠后的翻页成本较高
排序
- 最好在 “数字型” 与 “日期型” 字段上排序
- 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值
_source filtering
-
过滤你要查询的字段信息
-
如果 _source 没有存储,那就只返回匹配文档的元数据
-
_source 支持使用通配符
_source["name*","desc*"]
脚本字段
- 通过
painless
脚本,计算你所需要的新字段 - 用例:订单中有不同的汇率,需要结合汇率对订单价格进行排序
使用查询表达式 - Match
- match 默认使用 OR 连接查询
- 添加
operator
属性,改变单词连接方式
使用查询表达式 - Match_Phrase
match_phrase查询分析文本并根据分析的文本创建一个短语查询。match_phrase 会将检索关键词分词。match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的。
区别与match:match模糊匹配,先对输入进行分词,对分词后的结果进行查询,文档只要包含match查询条件的一部分就会被返回。
match_phrase 核心参数:slop 参数-Token之间的位置距离容差值
QueryString & SimpleQueryString 查询
Query String Query
- 类似URI Query