hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
- 起始标记->Elasticsearch入门(15讲):「15| 基本概念:URI Search详解」
- 结尾标记->Elasticsearch入门(15讲):「16 | 基本概念:Request Body与Query DSL简介」
URI Search详解
URI Search - 通过 URI query 实现搜索
GET /movies/ search?q=2O12&df=title&sort=year:desc&from=O&size= 1O&timeout=1s { “profile" : true }
- q 指定查询语句,使用Query String Syntax
- df 默认字段,不指定时,会对所有字段进行查询
- Sort排序 / from和size用于分页
- Profile 可以查看查询是如何被执行的
Query String Syntax (1)
- 指定字段 V.S泛查询
- q=title:2012 / q=2012
携带profile查看查询语句是如何执行的
使用了TermQuery ,查询的字段里包含了2012的
泛查询:没有指定df
使用的DisjunctionMaxQuery ,当不指定df时ES会对所有字段进行查询,这样的结果性能不好。
如果不知道df字段,又想对特定字段进行查询,我们可以在query后面带上字段的名称以冒号的方式跟上你要查询的内容
- Term v.S Phrase
- Beautiful Mind等效于Beautiful OR Mind
- “Beautiful Mind”,等效于Beautiful AND Mind。Phrase查询,还要求前后顺序保持一致
Phrase query 需要把查询的句子用引号引起来
代表 必须同时出现并且按照规定的顺序
- 分组与引号
- title:(Beautiful AND Mind)
- 当查询term query的时候需要用括号将它括起来 代表一个分组
- title="Beautiful Mind”
- 当出现Phrase query的时候需要用引号将它括起来 代表一个分组
- title:(Beautiful AND Mind)
引入分组的概念: 当出现term的时候需要用括号将它括起来 代表一个分组
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:{2019 To 2018]
- year:[* TO 2018]
- 区间表示: []闭区间,{} 开区间
- 算数符号
- year:>2010
- year:(>2010 && <=2018)
- year:(+>2010 +<=2018)
Query String Syntax (4)
- 通配符查询(通配符查询效率低,占用内存大,不建议使用。特别是放在最前面)
- ?代表1个字符,*代表0或多个字符
- title:mi?d
- title:be*
- ?代表1个字符,*代表0或多个字符
- 正则表达
- title:[bt]oy
- 模糊匹配与近似查询
- title:befutifl~1
- title:"lord rings" ~2
CodeDemo
#基本查询 GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
#带profile GET /movies/_search?q=2012&df=title { "profile":"true" }
#泛查询,正对_all,所有字段 GET /movies/_search?q=2012 { "profile":"true" }
#指定字段 GET /movies/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s { "profile":"true" }
#查找美丽心灵, Mind为泛查询 GET /movies/_search?q=title:Beautiful Mind { "profile":"true" }
#泛查询 GET /movies/_search?q=title:2012 { "profile":"true" }
#使用引号,Phrase查询 GET /movies/_search?q=title:"Beautiful Mind" { "profile":"true" }
#分组,Bool查询 GET /movies/_search?q=title:(Beautiful Mind) { "profile":"true" }
#布尔操作符 #查找美丽心灵 GET /movies/_search?q=title:(Beautiful AND Mind) { "profile":"true" }
#查找美丽心灵 GET /movies/_search?q=title:(Beautiful NOT Mind) { "profile":"true" }
#查找美丽心灵 GET /movies/_search?q=title:(Beautiful %2BMind) { "profile":"true" }
#范围查询 ,区间写法 GET /movies/_search?q=title:beautiful AND year:[2002 TO 2018%7D { "profile":"true" }
#通配符查询 GET /movies/_search?q=title:b* { "profile":"true" }
//模糊匹配&近似度匹配 GET /movies/_search?q=title:beautifl~1 { "profile":"true" }
GET /movies/_search?q=title:"Lord Rings"~2 { "profile":"true" }
相关阅读
Request Body与Query DSL简介
在Elasticsearch中,一些高阶的使用方法只能在Request Body search中做,我们建议尽量使用Request Body search
Request Body Search
- 将查询语句通过HTTP Request Body发送给Elasticsearch
- Query DSL
分页
- From从0开始,默认返回10个结果
- 获取靠后的翻页成本较高
排序
- 最好在‘数字型”与“日期型”字段上排序
- 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值
_sourch filtering
- 如果_ source 没有存储,那就只返回匹配的文档的元数据
- _source 支持使用通配符
_source["name*," desc*" ]
在请求体中加上sort的字段,可以将搜索结果按照日期排序
按照source filtering可以按照需要取回指定的信息
脚本字段
- 用例:订单中有不同的汇率,需要结合汇率对,订单价格进行排序
使用查询表达式 - Match
短语搜索 - Match Phrase
在query条件中的词必须按照顺序出现,也可以加上slop并设置为 “1”,代表中间可以有其他字符进入
加上operator and的方式 使搜索结果变得更加的精确
通过slop的方式在中间插入指定数量的term,增加搜索的结果
CodeDemo
- 需要通过 Kibana 导入Sample Data的电商数据。具体参考“2.2节-Kibana的安装与界面快速浏览”
- 需导入Movie测试数据,具体参考“2.4-Logstash安装与导入数据”
#ignore_unavailable=true,可以忽略尝试访问不存在的索引“404_idx”导致的报错 #查询movies分页 POST /movies,404_idx/_search?ignore_unavailable=true {
"profile": true, "query": { "match_all": {} } }POST /kibana_sample_data_ecommerce/_search { "from":10, "size":20,
"query":{ "match_all": {} } }#对日期排序 POST kibana_sample_data_ecommerce/_search { "sort":[{"order_date":"desc"}], "query":{ "match_all": {} } }
#source filtering POST kibana_sample_data_ecommerce/_search { "_source":["order_date"], "query":{ "match_all": {} } }
#脚本字段 GET kibana_sample_data_ecommerce/_search { "script_fields": { "new_field": { "script": { "lang": "painless", "source": "doc['order_date'].value+'hello'" } } }, "query": { "match_all": {} } }
POST movies/_search { "query": { "match": { "title": "last christmas" } } }
POST movies/_search { "query": { "match": { "title": { "query": "last christmas", "operator": "and" } } } }
POST movies/_search { "query": { "match_phrase": { "title":{ "query": "one love" } } } }
POST movies/_search { "query": { "match_phrase": { "title":{ "query": "one love", "slop": 1 } } } }
相关阅读
总结
学习了URL查询的基本使用方法,学会了使用加上profile参数去查看一个查询究竟是如何被执行的,也学习了term查询和Phrase查询的区别。学习了Request Body与Query DSL。
此文章为2月Day6学习笔记,内容来源于极客时间《Elasticsearch 核心技术与实战》