一 序
本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。
其实在高阶使用方法上只有 Request Body Search 才能实现,所以也是推荐使用这种方法查询学习。
二 Request Body Search
Request Body Search 将查询语句通过通过 HTTP 方式发送到 ES,进行查询。
2.1Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile":true,
"query":{
"match_all" : {} // 查询所有的文档
}
}
profile: "type" : "MatchAllDocsQuery",
"description" : "*:*",
分页:
- From 从 0 开始 默认返回 10 个结果
- 获取靠后的翻页,成本较高
POST /kibana_sample_data_ecommerce/_search
{
"from":10,
"size":20,
"query":{
"match_all": {}
}
}
排序:
GET kinaba_sample_data_ecommerce/_search
{
"sort":[{"order_date":"desc}],
"from":10,
"size":5,
"query":{
"match_all":{}
}
sort 根据某些字段进行排序,最好选择日期或者数字的列进行排序
_source 当你不需要对所有字段进行查询,通过 _source 选择需要展示数据,不填写则所有,)source 支持正则
#source filtering
POST kibana_sample_data_ecommerce/_search
{
"_source":["order_date"],//只显示order_date字段
"query":{
"match_all": {}
}
}
2.2 脚本字段
脚本字段简单说通过 ES 的 painless 脚本去算出一个新的字段。这个有什么用处呢?当你要对一个列排序,发现存储的有不同的单位,需要转换之后才能做一个统一的排序。
#脚本字段
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'hello'"
}
}
},
"query": {
"match_all": {}
}
}
用例:订单中有不同的汇率,需要结合汇率对订单价格进行排序。
脚本字段不要选择文本类型,默认禁止,可以通过设置 fielddata = true 开启,不建议。
2.3Match 查询表达式
前面 URL Search 中讲解 Term 和 Phrase 查询,现在我们来看在 Request Body Search 是怎么实现。
- 使用 quest-match 方式,下一层填写具体查询内容,
- 查询内容两个字符串,类似于 OR 方式。
POST movies/_search
{
"query": {
"match": {
"title": "last christmas"
}
}
}
相当于 OR ,如果你要要求 Who Last 要同时出现,增加 "operator": "and" 实现。
2.4Match Phrase
- 通过使用 query-match_phrase 实现 Phrase 查询
- query 的词必须按照顺序排列
- slop 实现模糊查询,slop=1,表示中间可以有一个字符
POST movies/_search
{
"query": {
"match_phrase": {
"title":{
"query": "one love"
}
}
}
}
没有搜索结果。
POST movies/_search
{
"query": {
"match_phrase": {
"title": {
"query": "Who Christmas",
"slop": 1
}
}
}
}
小结
URL Search 和 Request Body Search 都可以简单方便查询我们想要的结果, 那么我们应该采用哪种方式进行查询呢?在简单的进行查询两种方式没有什么区别,但是在 ES 中高级使用方法只能在 Request Body Search 中做,所有这里也是推荐学习和使用这种方法。
数据:需导入Movie测试数据,具体参考“2.4-Logstash安装与导入数据”
kibana_sample_data_ecommerce 索引是 kibana 自带的索引,需要手动在 kibana 进行点击导入。