es-searchApi概览-04

Elasticsearch searchApi概览

search API

  • URL Search
    • 在url使用query参数
  • Request Body
    • 使用ES提供的,基于json更加完备的,Quey Domain Specific Language(DSL)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      {
      "from" : 0, // 返回搜索结果的开始位置
      "size" : 10, // 分页大小,一次返回多少数据
      "_source" :[ ...需要返回的字段数组... ],
      "query" : { ...query子句... },
      "aggs" : { ..aggs子句.. },
      "sort" : { ..sort子句.. }
      }

指定查询的索引

语法 范围
/_search 集群上的所有索引
/index1/_search index1
/index1,index2/_search index1 和 index2
/index*/_search index开头的索引

URI查询

  • 使用‘q’,指定查询字符串
  • “query string syntax”,kv键值对
1
2
3
curl -i \
-X GET http://127.0.0.1:9200/kibana_sample_data_ecommerce/_search\
?q=customer_first_name:Eddie

URI search-通过URI query实现搜索

1
2
3
4
GET /movies/\_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s  
{
"profile": true
}
  • q 指定查询语句,使用qeruy string syntax 语法
  • df 默认字段,不指定时,会对所有字段进行查询
  • sort排序/from 和 size 用于分页
  • profile 可以查看查询是如何被执行的

Query String Syntax

  • 指定字段 vs 泛查询

    • q=title:2012 / q=2012
  • Term vs Phrase

    • Beautiful Mind 等效于 Beautiful OR Mind
    • “Beautiful Mind” 等效于 Beautiful AND Mind。Phrase 还要求前后顺序一致
  • 分组与引号

    • title:(Beautiful AND Mind)
    • title=”Beautiful Mind”
  • 布尔操作

    • AND / OR / NOT 或者 && / || / !
      • 必须大写
      • title:(matrix NOT reloaded)
  • 分组

    • +表示must
    • -表示must_not
    • title:(+matrix -reloaded)
  • 范围查询

    • 区间表示: []闭区间,{}开区间
      • year:{2019 TO 2018}
      • year:[* TO 2018]
    • 算数符号
      • year:>2010
      • year:(>2010&&<=2018)
      • year:(+>2010+<2018)
  • 通配符查询(通配符查询效率低,占用内存大,不建议使用。特别是放在最前面)

    • ? 代表1一个字符, * 代表0个或多个字符
      • title:mi?d
      • title:be*
  • 模糊匹配和近似查询

    • title:befutifl~1
    • title:”lord rings”~2

列了一些常用的查询方式,详细的内容还要到官网翻一翻

DSL的查询语法-官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl.html

  • 将查询语句通过HTTP Request Body 发送给ElasticSearch
  • Query DSL (domain-specific language)
    1
    2
    3
    4
     curl -i  \
    -X GET http://127.0.0.1:9200/kibana_sample_data_ecommerce/_search \
    -H 'Content-Type:application/json' \
    -d '{ "profile": true, "query":{ "match_all":{}}}'

分页

1
2
3
4
5
6
7
8
GET kibana_sample_data_ecommerce/_search
{
"from": 10, // 偏移量
"size": 20, // 数量
"query":{
"match_all": {}
}
}
  • from 从0开始,默认返回10个结果
  • 获取靠后的翻页成本更高

排序

1
2
3
4
5
6
7
8
9
GET kibana_sample_data_ecommerce/_search
{
"sort": [{"order_date": "desc"}], // 排序
"from": 10, // 偏移量
"size": 20, // 数量
"query":{
"match_all": {}
}
}
  • 最好在“数字型”和“日期型”的字段上排序
  • 因为对于多值类型和分析过的值,系统会选一个值,无法的值该值

_source filtering

1
2
3
4
5
6
7
8
9
10
GET kibana_sample_data_ecommerce/_search
{
"_source": ["order_date", "order_date", "category.keyword"],
"sort": [{"order_date": "desc"}], // 排序
"from": 10, // 偏移量
"size": 20, // 数量
"query":{
"match_all": {}
}
}
  • 如果_source 中的字段没有,那就值返回匹配的文档的元数据
  • _source 支持使用通配符_source[“name*“,”desc*“]

脚本字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_fields": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'hello'"
}
}
},
"query": {
"match_all": {}
}
}

painless 是es编写脚本的语言,默认为painless

使用Query 查询

match 匹配单个字段

1
2
3
4
5
6
7
8
9
10
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match": {
"category": { // category 是要查询的字段
"query": "clothing"
}
}
}
}
  • 返回与提供的文本和数字,日期或布尔值匹配的文档。在匹配之前分析提供的文本
  • match查询是执行全文搜索的标准查询,包括模糊匹配选项

term 精确匹配单个字段

1
2
3
4
5
6
7
8
9
10
GET kibana_sample_data_ecommerce/_search
{
"query": {
"term": {
"{filed}": "{value}"
}
}
}
- filed 需要匹配的字段名
- value 要匹配的内容

避免对文本字段使用term查询。
默认情况下,Elasticsearch会更改文本字段的值作为分析的一部分。这可能会使查找文本字段值的精确匹配变得困难。
要搜索文本字段值,请改用match查询。

  • 使用term 可根据精确值去匹配

terms 查询类似SQL的in

1
2
3
4
5
6
7
8
9
10
11
GET kibana_sample_data_ecommerce/_search
{
"query": {
"terms": {
"{filed}": [
"{value1}",
"{value2}"
]
}
}
}
  • 可匹配 filed 的值是否在列表中

range 范围查询

1
2
3
4
5
6
7
8
9
10
11
GET kibana_sample_data_ecommerce/_search
{
"query": {
"range": {
"{filed}": {
"gte": 10,
"lte": 20,
}
}
}
}

参数

  • gt
    -(可选)大于
  • gte
    -(可选)大于或等于
  • lt
    -(可选)小于
  • lte
    -(可选)小于或等于

bool 组合查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST kibana_sample_data_ecommerce/_search
{
"query": {
"bool" : {
"must" : {
"term" : { "customer_full_name" : "kimchy" }
},
"filter": {
"term" : { "customer_gender" : "MALE" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
}
}
}
  • must 子句,必须出现在匹配的文档中,有助于得分
  • filter 子句,必须出现在匹配的文档中,子句在过滤器上下文中执行,这意味着评分被忽略
  • should 子句,应该出现在匹配的文中
  • must_not 子句,不得出现在匹配的文中,子句在过滤器上下文中执行,这意味着评分被忽略

es-searchApi概览-04
http://example.com/2022/11/07/es/es-searchApi概览-04/
作者
weijun Wu
发布于
2022年11月7日
许可协议