Elasticsearch 学习笔记Day 06

138 阅读5分钟

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查看查询语句是如何执行的

image.png image.png 使用了TermQuery ,查询的字段里包含了2012的

image.png

泛查询:没有指定df

image.png 使用的DisjunctionMaxQuery ,当不指定df时ES会对所有字段进行查询,这样的结果性能不好。

如果不知道df字段,又想对特定字段进行查询,我们可以在query后面带上字段的名称以冒号的方式跟上你要查询的内容

image.png image.png

  • Term v.S Phrase
    • Beautiful Mind等效于Beautiful OR Mind
    • “Beautiful Mind”,等效于Beautiful AND Mind。Phrase查询,还要求前后顺序保持一致

image.png

Phrase query 需要把查询的句子用引号引起来

image.png 代表 必须同时出现并且按照规定的顺序

image.pngimage.png

  • 分组与引号
    • title:(Beautiful AND Mind)
      • 当查询term query的时候需要用括号将它括起来 代表一个分组
    • title="Beautiful Mind”
      • 当出现Phrase query的时候需要用引号将它括起来 代表一个分组

引入分组的概念: 当出现term的时候需要用括号将它括起来 代表一个分组

image.png image.png

Query String Syntax (2)

  • 布尔操作
    • AND/OR/NOT或者&&/|/!
      • 必须大写
      • title:(matrix NOT reloaded)
  • 分组
    • +表示must
    • -表示must_ not
    • title:(+matrix -reloaded)

image.pngimage.png image.pngimage.pngimage.pngimage.png

Query String Syntax (3)

  • 范围查询
    • 区间表示: []闭区间,{} 开区间
      • year:{2019 To 2018]
      • year:[* TO 2018]
  • 算数符号
    • year:>2010
    • year:(>2010 && <=2018)
    • year:(+>2010 +<=2018)

image.png image.png

Query String Syntax (4)

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

image.png image.png

  • 正则表达
    • title:[bt]oy
  • 模糊匹配与近似查询
    • title:befutifl~1
    • title:"lord rings" ~2

image.pngimage.pngimage.pngimage.png

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

image.png

分页

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

image.png

排序

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

image.png

_sourch filtering

  • 如果_ source 没有存储,那就只返回匹配的文档的元数据
  • _source 支持使用通配符

_source["name*," desc*" ] image.png

在请求体中加上sort的字段,可以将搜索结果按照日期排序

image.pngimage.png

按照source filtering可以按照需要取回指定的信息

image.pngimage.png

脚本字段

  • 用例:订单中有不同的汇率,需要结合汇率对,订单价格进行排序

image.png image.png

使用查询表达式 - Match

image.png

短语搜索 - Match Phrase

在query条件中的词必须按照顺序出现,也可以加上slop并设置为 “1”,代表中间可以有其他字符进入 image.png image.pngimage.png

加上operator and的方式 使搜索结果变得更加的精确

image.png image.png image.png

通过slop的方式在中间插入指定数量的term,增加搜索的结果

image.png image.png

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 核心技术与实战》