本节主要讲解 Elasticsearch 的 搜索相关功能 Search-API, 讲解什么是 URL Search 和 Request Body Search 的语法, 对常用的语法都会一一进行详细介绍.
1.Search API
Search API 分为两大类一个是 URL Search 和 Request Body Search.
URL Search
在 URL 中根据参数查询结果
Request Body Search
一种基于 JSON 格式的查询语言 Query Domain Specific Language (DSL)
- 2.URL Search
- GET /movies/_search?q=love&df=title&sort=year:desc&from=0&size=10&timeout=1s
- {
- "profile":"true"
- }
q 指定查询语句
df 指定查询字段, 不指定对所有字段进行查询
Sort 排序
from 和 size 用于分页
如果要查询执行过程, 可以增加 profile 为 true
- 2.1Query String Syntax
- 2.1.1TermQuery
- GET /movies/_search?q=title:(Beautiful Mind)
- {
- "profile":"true"
- }
输出为有 Beautiful 或者 Mind 的电影名称
- 2.1.2PhraseQuery
- GET /movies/_search?q=title:"Beautiful Mind"
- {
- "profile":"true"
- }
输出为按照顺序同时出现 "Beautiful Mind" 这个词语的电影名称
TermQuery 必须带有 () , 比如 (Beautiful Mind), 不带的情况是不一样的.
GET /movies/_search?q=title:(Beautiful Mind)
Mind 为泛查询, 对所有字段都进行查询
2.1.3 布尔查询
AND / OR / NOT 或者 && /|| / !
必须大写
- title:(Beautiful OR Mind)
- GET /movies/_search?q=title:(Beautiful OR Mind)
- {
- "profile":"true"
- }
里面执行是 BooleanQuery, 最后还是以 TermQuery 进行分组查询.
2.1.4 范围查询
[] 为闭区间,{} 为开区间
year:[2018 TO 2019], 查询时间在 2018-2019 年的电影
- GET /movies/_search?q= year:[2018 TO 2019]
- {
- "profile":"true"
- }
2.1.5 算数查询
year:>=2018, 匹配电影在 2018 年以后的电影
- GET /movies/_search?q=year:>=2018
- {
- "profile":"true"
- }
2.1.6 通配符和正则匹配
? 代表 1 个字符,* 代表 0 到多个字符, 这种不推荐, 占用太多空间
title:b*, 匹配电影名称有 b 开头的名称
title:[bu], 匹配电影名称有 b 开头的名称
GET /movies/_search?q=title:b*
2.1.7 模糊查询
"Avengers War"~2 ,Avengers 和 War 之间有两个 term, 匹配 Avengers: Infinity War - Part I, 不能匹配 Avengers: War.
GET /movies/_search?q=title:"Avengers War"~2
3.Request Body Search
其实在高阶使用方法上只有 Request Body Search 才能实现, 所以也是推荐使用这种方法查询学习.
Request Body Search 将查询语句通过通过 HTTP 方式发送到 ES, 进行查询
- 3.1Query DSL
- POST kibana_sample_data_ecommerce/_search
- {
- "profile": true,
- "_source":["customer_first_name","customer_full_name","customer_gender"],
- "from":10,
- "size":20,
- "sort":[{"order_date":"desc"}],
- "query": {
- "match_all": {}// 查询所有文档
- }
- }
from 和 size 进行分页,"from":10,
"size":20,from 从 10 开始, 返回 20 个结果, 不填写时 from=0,size=10
sort 根据某些字段进行排序, 最好选择日期或者数字的列进行排序
_source 当你不需要对所有字段进行查询, 通过 _source 选择需要展示数据, 不填写则所有,)source 支持正则
3.2 脚本字段
脚本字段简单说通过 ES 的 painless 脚本去算出一个新的字段. 这个有什么用处呢? 当你要对一个列排序, 发现存储的有不同的单位, 需要转换之后才能做一个统一的排序.
- GET kibana_sample_data_ecommerce/_search
- {
- "script_fields": {
- "new_field": {
- "script": {
- "lang": "painless",
- "source": "doc['customer_id']+'_2333333!'"
- }
- }
- },
- "query": {
- "match_all": {}
- }
- }
脚本字段不要选择文本类型, 默认禁止, 可以通过设置 fielddata = true 开启, 不建议.
3.3Match 查询表达式
前面 URL Search 中讲解 Term 和 Phrase 查询, 现在我们来看在 Request Body Search 是怎么实现.
使用 quest-match 方式, 下一层填写具体查询内容,
查询内容两个字符串, 类似于 OR 方式.
- POST movies/_search
- {
- "query": {
- "match": {
- "title": "Who Last"
- }
- }
- }
如果你要要求 Who Last 要同时出现, 增加 "operator": "and" 实现.
- POST movies/_search
- {
- "query": {
- "match": {
- "title": {
- "query": "Who Christmas",
- "operator": "and"
- }
- }
- }
- }
3.4Match Phrase
通过使用 query-match_phrase 实现 Phrase 查询
query 的词必须按照顺序排列
slop 实现模糊查询, slop=1, 表示中间可以有一个字符
- POST movies/_search
- {
- "query": {
- "match_phrase": {
- "title": {
- "query": "Who Christmas"
- }
- }
- }
- }
- POST movies/_search
- {
- "query": {
- "match_phrase": {
- "title": {
- "query": "Who Christmas",
- "slop": 1
- }
- }
- }
- }
4. 小结
本篇主要对 Search-API 的 URL Search 和 Request Body Search 详细介绍, URL Search 和 Request Body Search 都可以简单方便查询我们想要的结果, 那么我们应该采用哪种方式进行查询呢? 在简单的进行查询两种方式没有什么区别, 但是在 ES 中高级使用方法只能在 Request Body Search 中做, 所有这里也是推荐学习和使用这种方法, 对 Request Body Search 高阶使用的方法会在之后的章节进行讲解.
5. 数据来源
kibana_sample_data_ecommerce 索引是 kibana 自带的索引, 需要手动在 kibana 进行点击导入
movies 索引是 movielens 数据集, 通过 https://grouplens.org/datasets/movielens/ 这个地址下载. 通过 Logstash 导入. logstash.conf 和 数据文件在公众号后台回复 ES 获取.
[Elasticsearch 7 探索之路] (四)Analyzer 分析
[Elasticsearch 7 探索之路] (三) 倒排索引
[Elasticsearch 7 探索之路] (二) 文档的 CRUD 和批量操作
[Elasticsearch 7 搜索之路] (一) 什么是 Elasticsearch?
来源: https://www.cnblogs.com/TFengStorm/p/12026562.html