Search API

  • URI Search

    • 在URL中使用查询参数

  • Request Body Search

    • 使用Elasticsearch提供的,基于JSON格式的更加完备的Query Domain Special Language(DSL)

指定查询的索引

语法

范围

/_search

集群上所有的索引

/index1/_search

index1

/index1,index2/_search

index1和index2

/index*/_search

以index开头的索引

URI查询

  • 使用“q”,指定查询字符串

  • “query string syntax”,KV键值对

Request Body 查询

搜索响应介绍

衡量相关性

  • Information Retrieval

    • Precision(查准率)- 尽可能返回较少的无关文档

    • Recall(查全率)- 尽量返回较多的相关文档

    • Ranking - 是否能够按照相关度进行排序

URI Search - 通过URI query 实现搜索

  • q 指定查询语句,使用Query String Syntax

  • df 默认字段,不指定时,会对所有字段进行查询

  • sort 排序 / from 和 size 用于分页

  • Profile 可以查看查询是如何被执行的

Query String Syntax(1)

  • 指定字段 v.s 范查询

    • q=title:2012 / q=2012

  • Term v.s Phrase

    • Beautiful Mind 等效于 Beautiful OR Mind

    • "Beautiful Mind",等效于Beautiful AND Mind。Phrase查询,还要求前后顺序保持一致

  • 分组与引导

    • title:(Beautiful AND Mind)

    • title="Beautiful Mind"

Query String Syntax(2)

  • 布尔操作

    • AND / OR / NOT 或者 && / || / !

      • 必须大写

      • title:(matrix NOT reloaded)

  • 分组

    • +表示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*

  • 正则表达

    • title:[bt]oy

  • 模糊匹配与近似查询

    • title:befutifl~1

    • title:"lord rings"~2

Request Body Search

  • 将查询语句通过HTTP Request Body 发送给Elasticsearch

  • Query DSL

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":{}
  }
}
  • from 从0开始,默认返回10个结果

  • 获取靠后的翻页成本较高

排序

GET kibana_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc"}],
  "from":10,
  "size":5,
  "query":{
    "match_all":{}
  }
}
  • 最好在“数字型”与”日期型“字段上排序

  • 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值

_source filtering

GET kibana_sample_data_ecommerce/_search
{
  "_source":["order_date","order_date","category.keyword"],
  "from":10,
  "size":5,
  "query":{
    "match_all":{}
  }
}

  • 如果_source没有存储,那就只返回匹配的文档的元数据

  • _source支持使用通配符

    • _sourcce["name*","desc*"]

脚本字段

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

GET kibana_sample_data_ecommerce/_search
{
  "script_fields":{
    "new_field":{
      "script":{
        "lang":"painless",
        "source":"doc['order_date'].value+'hello'"
      }
    }
  },
  "from":10,
  "size":5,
  "query":{
    "match_all":{}
  }
}

使用查询表达式-Match

// Last OR Christmas
GET /comments/_doc/_search
{
  "query":{
    "match":{
      "comment":"Last Christmas" 
    }
  }
}


// Last AND Christmas
GET /comments/_doc/_search
{
  "query":{
    "match":{
      "comment":{
        "query":"Last Chrismas",
        "operator":"AND"
      }
    }
  }
}

短语搜索 - Match Phrase

// slop 1 代表中间可有一个其他的词进入
GET /comments/_doc/_search
{
  "query":{
    "match_phrase":{
      "comment":{
        "query":"Song Last Chrismas",
        "slop":1
      }
    }
  }
}

Query String

类似URI Query

POST users/_search
{
  "query":{
    "query_string":{
      "default_field":"name",
      "query":"Ruan AND Yiming"
    }
  }
}

POST user/_search
{
  "query":{
    "query_string":{
      "fields":["name","about"],
      "query":"(Ruan AND Yiming) OR (Java AND Elasticsearch)"
    }
  }
}

Simple Query String

POST users/_search
{
  "query":{
    "simple_query_string":{
      "query":"Ruan -Yiming",
      "fields":["name"],
      "default_operator":"AND"
    }
  }
}
  • 类似Query String,但是会忽略错误的语法,同时只支持部分查询语法

  • 不支持AND OR NOT,会当作字符串处理

  • Term之间默认的关系是OR,可以指定Operator

  • 支持部分逻辑

    • + 替代AND

    • | 替代OR

    • - 替代NOT