ES基础内容--Search API

136 阅读4分钟

Search API

一、URI Search(使用较少)

通过在URI中使用查询参数进行查询

image_E6uIAoxqLj.png

URI Search示例

GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
{
  "profile": "true"
}

其中:

  • q:指定查询语句,使用Query String Syntax;
  • df:指定查询的字段,如果不指定,那么会查询所有字段;
  • sort排序/from和size用于分页;
  • profile:用于查看查询语句的执行详情;

Query String Syntax

  • 指定字段 与 泛查询

    1. q=title:2012 对于title字段的2012 term查询;
    2. q=2012 对于全字段的2012 匹配查询;
  • Term查询 与 Phrase查询

    1. q=titile:Beautiful Mind等于Beautiful OR Mind,对于Beautiful会执行title字段的term查询,但对于Mind会执行全字段的匹配;
    2. q=titile:“Beautiful Mind”等于Beautiful AND Mind。执行的是Phrase查询,还要求前后顺序保持一致;
  • 分组 与 引号

    1. q=title:(Beautiful Mind),执行对于title字段的Beautiful 匹配 和 Mind的匹配;
    2. q=titile:"Beautiful Mind",即执行Phrase查询;
  • 布尔操作

    1. AND / OR / NOT 或者 && / || / !
    2. 要点:在词之间的连接必须大写,例如title:(matrix NOT reloaded) ;
  • 分组must与must_not操作

    1. 要点:+号表示must,-号表示must_not ,例如title:(+matrix -reloaded) ;
  • 范围查询

    1. 区间表示闭区间为[],开区间为{};举例:year:{2019 TO 2018],year:[* TO 2018]
  • 算数符号

    1. year:>2010;
    2. year:(>2010 && <=2018) ;
    3. year:(+>2010 +<=2018);
  • 通配符查询(该查询效率低,占用内存大,不建议使用,特别是放在最前面)

    1. ?代表1个字符,*代表0个或多个字符;
    2. 举例:title:mi?d、title:be *;
  • 正则表达

    1. 举例:title:[bt]oy;
  • 模糊匹配与近似查询

    1. title:beautifl ——模糊匹配,比如在输错查询的词的时候,模糊匹配也能把beautiful单词正确命中查询;
    2. title:“Lord Rings” —— 近似查询,在不加~2的时候,该查询为phrase查询,是严格按照“Lord Rings”进行查询;但是加了之后,也会命中title为“Lord of the Rings”的这样的数据;

二、Request Body Search (使用较多)

使用ES提供,基于JSON格式更加完备的搜索DSL

image_96khppInNh.png

image_elybvyyhCS.png

三、Request Body 和 Query DSL简介

分页

POST /kibana_sample_data_ecommerce/_search
{
  "from":10,
  "size":20,
  "query":{
    "match_all": {}
  }
}
  • 通过from和size参数进行分页查询;其中from代表当前页码,计数从0开始,size代表每页大小(默认是10);
  • 越往后翻页,对es的压力越大;因为es翻页会将之前页码的数据也会读入,所以越往后累计的数据量越多;
  • match_all代表查询全部数据;

排序

POST kibana_sample_data_ecommerce/_search
{
  "sort":[{"order_date":"desc"}],
  "query":{
    "match_all": {}
  }
}
  • 最好对日期型或者数字型字段执行排序;因为对于多值类型或者分析过的字段排序,系统会选一个值,而我们无法得知该值;

字段回显过滤

POST kibana_sample_data_ecommerce/_search
{
  "_source":["order_date"],
  "query":{
    "match_all": {}
  }
}
  • _source字段可以对查询的结果数据进行对应的字段过滤,拿到我们只想知道的信息;
  • 如果_source没有存储,那么就只返回匹配的文档的元数据;
  • source支持通配符表示字段,例如:" source":["name ","desc"];

脚本字段

GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}
  • “script_fields”表示开启执行脚本;
  • “field_new”表示执行完成脚本后的数据,新生成的字段名称;
  • “lang”代表使用的脚本类型,一般为painless脚本;
  • “source”表示脚本的内容;

查询表达式——match

POST movies/_search
{
  "query": {
    "match": {
      "title": "last christmas"
    }
  }
}
  • 对title字段进行match查询,其中默认会对查询条件进行分词后通过OR来查询 ,即查询含有“Last“ OR ”Christmas”;
POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}
  • 如果想要分词后,仍以关联的顺序查询,则需要“operator”字段,查询含有"Last Christmas"的数据;

短语搜索——match phrase

POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love"
      }
    }
  }
}
  • match_phrase搜索,会将查询条件以一个整体进行查询搜索;
POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
        "slop": 1
      }
    }
  }
}
  • 如果想要在整体的短语中,允许匹配到中间有几个其他的词的时候,则通过“slop”字段进行查询;

Query String

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

#多字段
POST users/_search
{
  "query": {
    "query_string": {
      "fields":["name","about"],
      "query": "(Ruan AND Yiming) OR (Java AND Elasticsearch)"
    }
  }
}
  • Query String:"default_field"即df,用于指定查询的字段(“fields”可指定多个字段查询);其中“query“中,可以使用AND OR 等表示关系的词语,用于进行与和或的查询;

Simple Query String

#Simple Query 默认的operator是 Or
POST users/_search
{
  "query": {
    "simple_query_string": {
      "query": "Ruan AND Yiming",
      "fields": ["name"]
    }
  }
}


POST users/_search
{
  "query": {
    "simple_query_string": {
      "query": "Ruan Yiming",
      "fields": ["name"],
      "default_operator": "AND"
    }
  }
}
  • 类似于Query String,但是会忽略错误的语法,同时只支持部分查询语法;
  • 在查询条件语句中,不支持AND OR NOT,会将这些关系词当做字符串来处理;
  • 默认的查询是,将query语句中的词进行切分,通过OR关系来进行查询;
  • 可以通过"default_operator"来指定查询条件切词后的查询关系;
  • 支持部分逻辑:+代表AND,|代表或,-代表NOT;