一、请求体查询

请求体 search API, 之所以称之为请求体查询(Full-Body Search),因为大部分参数是通过http请求体而非查询字符串来传递的。

请求体查询:不仅可以处理自身的查询请求,还允许你对结果进行片段强调(高亮)、对所有或部分结果进行聚合分析,同时还可以给出 你是不是想找 的建议,这些建议可以引导使用者快速找到他想要的结果。

某些特定语言(特别是 JavaScript)的 HTTP 库是不允许 GET 请求带有请求体的,可以用POST代替。

1、空查询

空查询,空的请求体会返回所有索引中的所有文档

GET /_search
{}

用一个查询字符串,在多个索引库中和多个types中查询:

GET /index_2014*/type1,type2/_search
{}

使用 from 和 size 参数分页:

GET /_search
{
"from": 30,
"size": 10
}

2、查询表达式(Query DSL)

使用

将查询语句传递给query参数

GET /_search
{
"query": YOUR_QUERY_HERE
}

查询语句结构

典型结构:

{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}

针对某个字段:

{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}

例子:

GET /_search
{
"query": {
"match": {
"city": "Shaft"
}
}
}

match_all查询

空查询(empty search),在功能上等价于使用 match_all 查询:

GET /_search
{
"query": {
"match_all": {}
}
}

合并查询语句

叶子语句:用于将查询字符串和一个字段(或者多个字段)对比,match

复合语句:主要用于合并其它查询语句,bool

GET /_search
{
"query": {
"bool": {
"must":{"match":{"state":"KY"}},
"must_not":{"match":{"city:":"Yettem"}},
"should":{"match":{"address":"382 Columbia Street"}},
"filter": { "range": { "age" : { "gt" : 30 }} }
}
}
}

3、查询与过滤

过滤

查询被设置成一个“不评分”或者“过滤”查询。匹配或者不匹配。

查询

查询就变成了一个“评分”的查询。一个评分查询计算每一个文档与此查询的相关程度,同时将这个相关程度分配给表示相关性的字段_score,并且按照相关性对匹配到的文档进行排序。

注意

"filter" 这个词表示不评分、只过滤情况下的查询。== "filter" 、 "filtering query" 和 "non-scoring query"

"query" 我们指的是 "scoring query"

性能差异

过滤查询(Filtering queries:计算快,经常用不评分查询结果稀少,结果会被缓存到内存中以便快速读取,所以有各种各样的手段来优化查询结果。

评分查询(scoring queries):计算费力,查询结果并不缓存。

4、最重要的查询

match_all查询

匹配所有文档,默认查询方式。它经常与 filter 结合使用

{ "match_all": {}}

match查询

标准查询,无论你在任何字段上进行的是全文搜索还是精确查询。

全文字段使用时,在执行查询前,它将用正确的分析器去分析查询字符串

{ "match": { "tweet": "About Search" }}

在一个精确值字段使用,例如数字、日期、布尔或者一个 not_analyzed 字符串字段,它会精确匹配给定的值:

{ "match": { "age":    26           }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}

multi_match 查询

可以在多个字段上执行相同的 match 查询:

GET /_search
{
"query": {
"multi_match": {
"query": "728",
"fields": [ "address", "account_number" ]
}
}
}

解释:查询在address和account_number字段带有728字符串的文档。

range查询

找出那些落在指定区间内的数字或者时间:

{
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}

操作符如下:

  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于

term查询

被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串:

{ "term": { "age":    26           }}
{ "term": { "date": "2014-09-01" }}
{ "term": { "public": true }}
{ "term": { "tag": "full_text" }}

注意:以上某一行

terms查询

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:

GET /_search
{
"query": {
"terms": { "age": [39,38,30 ] }
}
}

解释:年龄为39或38或30的文档。

exists查询、missing查询

用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档:

GET /_search
{
"query": {
"exists": {
"field": "title"
}
}
}

解释:查询title字段有值的文档

5、组合多查询

可用bool查询,它接受以下参数:

  • must:文档 必须 匹配这些条件才能被包含进来。
  • must_not:文档 必须不 匹配这些条件才能被包含进来。
  • should:如果满足这些语句中的任意语句,将增加_score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
  • filter:必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

bool查询

查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果_两者_都满足,那么它排名将更高:

{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }},
{ "range": { "date": { "gte": "2014-01-01" }}}
]
}
}

增加带过滤器的bool查询

如果我们不想因为文档的时间而影响得分,可以用 filter 语句来重写前面的例子:

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "range": { "date": { "gte": "2014-01-01" }} ![0f67842b8cc059137a88288e95115a18.png](evernotecid://20C3AB82-3EA7-481C-B3D2-078868D90727/appyinxiangcom/23631184/ENNote/p10?hash=0f67842b8cc059137a88288e95115a18)         }
    }
}

如果你需要通过多个不同的标准来过滤你的文档,bool查询本身也可以被用做不评分的查询,简单地将它放置到filter语句中并在内部构建布尔逻辑:

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "bool": { ![0f67842b8cc059137a88288e95115a18.png](evernotecid://20C3AB82-3EA7-481C-B3D2-078868D90727/appyinxiangcom/23631184/ENNote/p10?hash=0f67842b8cc059137a88288e95115a18)               "must": [
                  { "range": { "date": { "gte": "2014-01-01" }}},
                  { "range": { "price": { "lte": 29.99 }}}
              ],
              "must_not": [
                  { "term": { "category": "ebooks" }}
              ]
          }
        }
    }
}

constant_score查询

可以使用它来取代只有 filter 语句的 bool 查询,性能相同,但是简洁:

{
    "constant_score":   {
        "filter": {
            "term": { "category": "ebooks" } ![0f67842b8cc059137a88288e95115a18.png](evernotecid://20C3AB82-3EA7-481C-B3D2-078868D90727/appyinxiangcom/23631184/ENNote/p10?hash=0f67842b8cc059137a88288e95115a18)         }
    }
}

解释:term 查询被放置在 constant_score 中,转成不评分的 filter。这种方式可以用来取代只有 filter 语句的 bool 查询。

6、验证查询

validate-query API 可以用来验证查询是否合法:

GET /bank/address/_validate/query?
{
"query": {
"address" : {
"match" : "Avenue"
}
}
}

解释不合法原因:

GET /bank/address/_validate/query?explain
{
"query": {
"address" : {
"match" : "Avenue"
}
}
}

二、排序与相关性

1、排序

在 Elasticsearch 中, 相关性得分 由一个浮点数进行表示,并在搜索结果中通过_score 参数返回, 默认排序是_score 降序。

使用 constant_score 查询进行替代bool,让所有文档应用一个恒定分数(默认为 1 ),不是0:

GET /_search
{
"query" : {
"constant_score" : {
"filter" : {
"term" : {
"user_id" : 1
}
}
}
}
}

2、按照字段的值排序

GET /_search
{
"query" : {
"bool" : {
"filter" : { "term" : { "age" : 40 }}
}
},
"sort": { "balance": { "order": "desc" }}
}

3、多级排序

假定我们想要结合使用 date和_score 进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序:

GET /_search
{
"query" : {
"bool" : {
"must": { "match": { "tweet": "manage text search" }},
"filter" : { "term" : { "user_id" : 2 }}
}
},
"sort": [
{ "date": { "order": "desc" }},
{ "_score": { "order": "desc" }}
]
}

Query-string 搜索 也支持自定义排序,可以在查询字符串中使用 sort 参数:

GET /_search?sort=date:desc&sort=_score&q=search

4、多值字段排序

情形:一个字段里有多个值,并且这些值没有顺序,应该选择哪个值排序。

对于数字或日期,你可以将多值字段减为单值,这可以通过使用 min 、 max 、 avg 或是 sum 排序模式 。 例如你可以按照每个 date 字段中的最早日期进行排序,通过以下方法:

"sort": {
"dates": {
"order": "asc",
"mode": "min"
}
}

5、字符串排序与多字段

一个简单的方法是用两种方式对同一个字符串进行索引,这将在文档中包括两个字段: analyzed 用于搜索, not_analyzed 用于排序。

为一个多字段映射如:

"tweet": { ![0f67842b8cc059137a88288e95115a18.png](evernotecid://20C3AB82-3EA7-481C-B3D2-078868D90727/appyinxiangcom/23631184/ENNote/p10?hash=0f67842b8cc059137a88288e95115a18)

    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": {
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}
  • tweet 主字段与之前的一样: 是一个 analyzed 全文字段。
  • 新的 tweet.raw 子字段是 not_analyzed.

现在,使用 tweet 字段用于搜索,tweet.raw 字段用于排序:

GET /_search
{
"query": {
"match": {
"tweet": "elasticsearch"
}
},
"sort": "tweet.raw"
}

注意:以全文 analyzed 字段排序会消耗大量的内存

第2部分 Elasticsearch查询-请求体查询、排序的更多相关文章

  1. elasticsearch 基础 —— 请求体查询

    请求体查询 简易 查询 -query-string search- 对于用命令行进行即席查询(ad-hoc)是非常有用的. 然而,为了充分利用查询的强大功能,你应该使用 请求体 search API, ...

  2. elasticsearch(5) 请求体搜索

    上一篇提到的轻量搜索非常简单便捷,但是通过请求体查询可以更充分的利用查询的强大功能.因为_search api中大部分参数是通过HTTP请求体而非查询字符串来传递的. 一 空查询 对于空查询来说,最简 ...

  3. elasticsearch 请求体查询方式整理

    空查询(empty search) —{}— 在功能上等价于使用 match_all 查询, 正如其名字一样,匹配所有文档: GET /_search { "query": { & ...

  4. Elasticsearch按请求体基本查询

    1 分页: localhost:9200/get-together/_search {"query": {"match_all": {}},"from ...

  5. ElasticSearch(6)-结构化查询

    引用:ElasticSearch权威指南 一.请求体查询 请求体查询 简单查询语句(lite)是一种有效的命令行_adhoc_查询.但是,如果你想要善用搜索,你必须使用请求体查询(request bo ...

  6. Flask中获取参数(路径,查询,请求体,请求头)

    上一篇中已经讲述了:HTTP协议向服务器传参有几种途径{ 链接 } 在Flask中同样通过这4中传参途径进行归纳: 1. URL中路径参数的获取: 拓展: # 路由参数/路径参数:http://127 ...

  7. Django中获取参数(路径,查询,请求头,请求体)

    一.通常HTTP协议向服务器传参有几种途径 : 提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取: 查询字符串(query string), ...

  8. elasticsearch基本概念与查询语法

    序言 后面有大量类似于mysql的sum, group by查询 elk === elk总体架构 https://www.elastic.co/cn/products Beat 基于go语言写的轻量型 ...

  9. elasticsearch 深入 —— Scroll滚动查询

    Scroll search 请求返回一个单一的结果"页",而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor. 滚动并 ...

随机推荐

  1. Spring动态切换多数据源事务开启后,动态数据源切换失效解决方案

    关于某操作中开启事务后,动态切换数据源机制失效的问题,暂时想到一个取巧的方法,在Spring声明式事务配置中,可对不改变数据库数据的方法采用不支持事务的配置,如下: 对单纯查询数据的操作设置为不支持事 ...

  2. mui 等待动画loading mui.showLoading

    显示加载框:mui.showLoading("正在加载..","div"); //加载文字和类型,plus环境中类型为div时强制以div方式显示隐藏加载框:m ...

  3. Python -- 正则表达式 regular expression

    正则表达式(regular expression) 根据其英文翻译,re模块 作用:用来匹配字符串.  在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配. 设计思想:用一 ...

  4. JS的ES6的iterator

    一.iterator 1.概念:iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制. 2.作用: 为各种数据结构,提供一个统一的.简便的访问接口: 使得数据结构的成员能够按某种次序 ...

  5. CF732D Exams 题解

    CF732D Exams 题目描述 Vasiliy has an exam period which will continue for \(n\) days. He has to pass exam ...

  6. 洛谷P2607题解

    想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...

  7. SHOI做题记录

    LOJ #2027. 「SHOI2016」黑暗前的幻想乡 考虑到每个公司一条边,那就等价于没有任何一家公司没有边. 然后就可以容斥+矩阵树定理,没了. LOJ #2028. 「SHOI2016」随机序 ...

  8. 关于windows10用c++部署libtorch过程中遇到的一些问题

    libtorch1.0 vs2017 CMake3.14 windows10 无cuda 用c++调用pytorch模型官网上面有详细教程,也有很多博客,可以参考以下链接:https://blog.c ...

  9. cocos: 链接错误: _lz_adler32 in liblibquickmac.a

    错误: Undefined symbols for architecture x86_64: "_adler32", referenced from: _lz_adler32 in ...

  10. Guava 库

    https://www.yiibai.com/guava https://wizardforcel.gitbooks.io/guava-tutorial/content/1.html com.goog ...