美文网首页
Elasticsearch Search API

Elasticsearch Search API

作者: 侧耳倾听y | 来源:发表于2021-11-20 16:38 被阅读0次

在ES中,text类型的字段,保存时会分词,查询时也会分词后进行查询。而keyword类型字段保存和查询时都不会分词。

URI Search

在URL中使用查询参数。

参数

  • q:指定查询语句,使用Query String Syntax;
  • df:默认字段,不指定时,会对所有字段进行查询;
  • Sort排序 / from 和 Size 用于分页;
  • Profile 可以查看查询时如何执行。

Query String Syntax

  • 指定字段
# 查询title字段包含2021的数据,使用的是 TermQuery(title字段是text类型)
GET /movies/_search?q=2012&df=title
# 另一种写法
GET /movies/_search?q=title:2021
# 带上sort等参数
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
  • 泛查询
# 查询所有字段包含或等于2021的数据,使用的是 DisjunctionMaxQuery 
GET /movies/_search?q=2012
  • Term vs Phrase
# 查询title字段中包含Beautiful 和 Mind的数据,使用的是 PhraseQuery,Phrase查询,还要求前后顺序保持一致
GET /movies/_search?q=title:"Beautiful Mind"
# 查询title字段包含Beautiful 或其他字段包含 Mind的数据,使用TermQuery(对title字段)和DisjunctionMaxQuery (对所有字段)
GET /movies/_search?q=title:Beautiful Mind
  • 分组与引号
    TermQuery 使用括号括起来;
    PhraseQuery 使用引号括起来。
# 查询title字段包含Beautiful 或Mind 的数据,使用的是 TermQuery 
GET /movies/_search?q=title:(Beautiful Mind)
  • 布尔操作
    两个TermQuery在一起,默认是or的关系,其他关系操作符:
    AND / OR / NOT
  • 分组
    +表示 msut
    -表示 must_not
# 查询title中包含了Beautiful 和Mind 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful AND Mind)
# 查询title中包含了Beautiful 但不包含Mind 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful NOT Mind)
# 等价于上一句
GET /movies/_search?q=title:(+Beautiful -Mind)
# 查询title包含了Mind和可能包含Beautiful 的数据,使用的是BooleanQuery
GET /movies/_search?q=title:(Beautiful %2BMind)
  • 范围查询
    区间表示:[]闭区间,{}开区间
# 查询year字段大于1980的数据,使用的是IndexOrDocValuesQuery
GET /movies/_search?q=year:>=1980
# 查询 year字段大于2010小于2018的数据,使用的是IndexOrDocValuesQuery
GET /movies/_search?q=year:[2010 TO 2018]
  • 通配符查询(通配符查询效率低,占用内存大,不建议使用)
    ? 代表1个字符,* 代表0个或多个字符
# 查询title字段中有b开头的term的数据,使用的是MultiTermQueryConstantScoreWrapper
GET /movies/_search?q=title:b*
  • 模糊匹配 & 近似匹配
# 查询title字段中类似beautifl(有一个字符的误差)的数据,使用的是BoostQuery
GET /movies/_search?q=title:beautifl~1
# 查询title字段中有类似Lord Rings的短语,中间可以有小于2个间隔,使用的是PhraseQuery
GET /movies/_search?q=title:"Lord Rings"~2

Request Body Search

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

  • 分页:from,size
  • 排序:sort:[{"字段名" : "desc"}]
  • _source filtering
    如果_source没有存储,那就只返回匹配的文档的元数据;
    _source支持使用通配符:_source["name*"]。
  • 脚本字段:
    使用painless脚本,计算出一个结果作为字段。
# order_date字段和hello拼接作为一个新字段
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
}
  • 使用Match
# operator为and表示两个term是and的关系,默认为or的关系
POST movies/_search
{
  "query": {
    "match": {
      "title": {
        "query": "last christmas",
        "operator": "and"
      }
    }
  }
}
  • 短语搜索 - Match Phrase
# slop表示短语之间可以有多少个位置
POST movies/_search
{
  "query": {
    "match_phrase": {
      "title":{
        "query": "one love",
        "slop": 1

      }
    }
  }
}

Query String

类似于URI查询

# 检索内容中可以有操作符,例如AND 、OR
POST 索引名/_search
{
  "query" : {
    "query_string" : {
      "default field" : "字段名",
      "query" : "检索内容"
    }
  }
}

Simple Query String

  • 类似于Query String,但会忽略错误的语法,同时只支持部分查询语法;
  • 不支持 AND OR NOT,会当做字符串处理;
  • Term 之间默认关系是OR,可以指定Operator。
POST 索引名/_search
{
  "query" : {
    "simple_query_string" : {
      "fields" : ["字段名"],
      "query" : "检索内容",
      "default_operator" : "AND"
    }
  }
}

相关文章

网友评论

      本文标题:Elasticsearch Search API

      本文链接:https://www.haomeiwen.com/subject/xovytrtx.html