elasticsearch search API

本文参考官方提供api提炼出来的

https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

URI查询

elasticsearch可以通过提供请求参数纯粹使用URI来执行搜索请求。

GET twitter/_search?q=user:kimchy
名称描述

q

查询字符串(映射到query_string查询,有关详细信息,请参阅 查询字符串查询)。

df

在查询中未定义字段前缀时使用的默认字段。

analyzer

分析查询字符串时要使用的分析器名称。

analyze_wildcard

是否应分析通配符和前缀查询。默认为false

batched_reduce_size

应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。

default_operator

要使用的默认运算符可以是AND或 OR。默认为OR

lenient

如果设置为true将导致忽略基于格式的失败(如向数字字段提供文本)。默认为false。

explain

对于每个命中,包含如何计算命中得分的解释。

_source

设置为false禁用_source字段检索。您还可以使用_source_include&检索部分文档_source_exclude( 有关详细信息,请参阅请求正文文档)

stored_fields

每个匹配返回的文档的选择性存储字段,逗号分隔。不指定任何值将导致没有字段返回。

sort

排序执行。可以是fieldName或 fieldName:asc/ 的形式fieldName:desc。fieldName可以是文档中的实际字段,也可以是特殊_score名称,表示基于分数的排序。可以有几个sort参数(顺序很重要)。

track_scores

排序时,设置为true仍然跟踪分数并将其作为每个匹配的一部分返回。

track_total_hits

设置为false禁用跟踪与查询匹配的匹配总数。(有关详细信息,请参阅索引排序)。默认为true。

timeout

搜索超时,将搜索请求限制在指定的时间值内执行,并使用在到期时累积的点击数进行保释。默认为无超时。

terminate_after

在达到查询执行将提前终止时,为每个分片收集的最大文档数。如果设置,响应将具有一个布尔字段,terminated_early以指示查询执行是否实际上已终止。默认为no terminate_after。

from

从命中的索引开始返回。默认为0

size

要返回的点击次数。默认为10

search_type

要执行的搜索操作的类型。可以是 dfs_query_then_fetchquery_then_fetch。默认为query_then_fetch。有关可以执行的不同搜索类型的更多详细信息,请参阅 搜索类型

allow_partial_search_results

false如果请求将产生部分结果,则设置为返回整体故障。默认为true,这将允许在超时或部分失败的情况下获得部分结果。

Requet Body搜索

Requet Body请求可以在其主体内使用包括查询DSL的搜索DSL来执行。

GET /twitter/_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

timeout

搜索超时,将搜索请求限制在指定的时间值内执行,并使用在到期时累积的点击数进行保释。使用“ 搜索取消” 编辑机制在达到超时后取消搜索请求。默认为无超时。请参阅时间单位编辑

from

从某个偏移量中检索命中。默认为0

size

要返回的点击次数。默认为10。如果您不关心某些匹配,但只关注匹配和/或聚合的数量,将值设置为0有助于提高性能。

search_type

要执行的搜索操作的类型。可以是 dfs_query_then_fetchquery_then_fetch。默认为query_then_fetch。请参阅搜索类型以获取更多

request_cache

设置为truefalse启用或禁用对于size为0的请求的搜索结果的缓存,即聚合和建议(未返回顶部命中)。请参阅Shard请求缓存

allow_partial_search_results

false如果请求将产生部分结果,则 设置为返回整体故障。默认为true,这将在超时或部分失败的情况下允许部分结果。

terminate_after

在达到查询执行将提前终止时,为每个分片收集的最大文档数。如果设置,响应将具有一个布尔字段,terminated_early以指示查询执行是否实际上已终止。默认为no terminate_after。

batched_reduce_size

应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。

Query

搜索请求主体中的查询元素允许使用查询DSL定义查询。

GET /_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

From/Size

结果的分页可以通过使用fromsize 参数来完成。该from参数定义要获取的第一个结果的偏移量。该size参数允许您配置要返回的最大命中数。

GET /_search
{
    "from" : 0, "size" : 10,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Sort

允许在特定字段上添加一个或多个排序。每种类型也可以反转。排序是在每个字段级别定义的,具有用于_score按分数排序的特殊字段名称,以及_doc按索引顺序排序。

GET /my_index/_search
{
    "sort" : [
        { "post_date" : {"order" : "asc"}},
        "user",
        { "name" : "desc" },
        { "age" : "desc" },
        "_score"
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

在_score上排序时,顺序默认为desc,在排序其他任何内容时默认为asc

asc

按升序排序

desc

按降序排序

Elasticsearch支持按数组或多值字段进行排序。 mode选项控制选择哪个数组值以对其所属的文档进行排序。 mode选项可以具有以下值

min

选择最低值。

max

选择最高价值。

sum

使用所有值的总和作为排序值。仅适用于基于数字的数组字段。

avg

使用所有值的平均值作为排序值。仅适用于基于数字的数组字段。

median

使用所有值的中位数作为排序值。仅适用于基于数字的数组字段。

Elasticsearch还支持按一个或多个嵌套对象内的字段进行排序。 嵌套字段支持的排序具有嵌套排序选项,具有以下属性:

path定义要排序的嵌套对象。实际排序字段必须是此嵌套对象中的直接字段。按嵌套字段排序时,此字段是必填字段。
filter嵌套路径中的内部对象应与之匹配的过滤器,以便通过排序考虑其字段值。常见的情况是在嵌套过滤器或查询中重复查询/过滤。默认情况下,没有nested_filter活动。
nested与顶级相同,nested但适用于当前嵌套对象中的另一个嵌套路径。
POST /_search
{
   "query" : {
      "term" : { "product" : "chocolate" }
   },
   "sort" : [
       {
          "offer.price" : {
             "mode" :  "avg",
             "order" : "asc",
             "nested": {
                "path": "offer",
                "filter": {
                   "term" : { "offer.color" : "blue" }
                }
             }
          }
       }
    ]
}
POST /_search
{
   "query": {
      "nested": {
         "path": "parent",
         "query": {
            "bool": {
                "must": {"range": {"parent.age": {"gte": 21}}},
                "filter": {
                    "nested": {
                        "path": "parent.child",
                        "query": {"match": {"parent.child.name": "matt"}}
                    }
                }
            }
         }
      }
   },
   "sort" : [
      {
         "parent.child.age" : {
            "mode" :  "min",
            "order" : "asc",
            "nested": {
               "path": "parent",
               "filter": {
                  "range": {"parent.age": {"gte": 21}}
               },
               "nested": {
                  "path": "parent.child",
                  "filter": {
                     "match": {"parent.child.name": "matt"}
                  }
               }
            }
         }
      }
   ]
}

Source过滤

允许控制_source每次点击返回字段的方式。

默认情况下,_source除非您使用了stored_fields参数或_source禁用了字段,否则操作将返回字段的内容。

您可以_source使用以下_source参数关闭检索:

要禁用_source检索设置为false

GET /_search
{
    "_source": false,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
GET /_search
{
    "_source": {
        "includes": [ "obj1.*", "obj2.*" ],
        "excludes": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Script Fields

允许为每个匹配返回脚本评估(基于不同的字段)

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * 2"
            }
        },
        "test2" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * params.factor",
                "params" : {
                    "factor"  : 2.0
                }
            }
        }
    }
}

脚本字段可以处理未存储的字段(my_field_name在上面的例子中),并允许返回要返回的自定义值(脚本的评估值)。

Doc value Fields

允许为每个匹配返回字段的doc值表示

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "docvalue_fields" : [
        {
            "field": "my_ip_field",
            "format": "use_field_mapping"
        },
        {
            "field": "my_date_field",
            "format": "epoch_millis"
        }
    ]
}

Post filter 后过滤器

在已经计算聚合之后,将post_filter其应用于hits搜索请求最末端的搜索。

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": { "brand": "gucci" }
      }
    }
  },
  "aggs": {
    "colors": {
      "terms": { "field": "color" }
    },
    "color_red": {
      "filter": {
        "term": { "color": "red" }
      },
      "aggs": {
        "models": {
          "terms": { "field": "model" }
        }
      }
    }
  },
  "post_filter": {
    "term": { "color": "red" }
  }
}

当你需要对搜索结果和聚合结果做不同的过滤时,你才应该使用 post_filter , 有时用户会在普通搜索使用 post_filter 。

不要这么做! post_filter 的特性是在查询 之后 执行,任何过滤对性能带来的好处(比如缓存)都会完全失去。

在我们需要不同过滤时, post_filter 只与聚合一起使用。

Rescoring

重新排序可以通过使用辅助(通常更昂贵)算法重新排序由query和和 post_filter阶段返回的顶部(例如100-500)文档来提高精度 ,而不是将昂贵的算法应用于索引中的所有文档。

rescore它返回其结果,以通过处理整体搜索请求的节点进行排序之前请求是在每个碎片执行。

目前,rescore API只有一个实现:查询rescorer,它使用查询来调整评分。

查询rescorer仅对query和和 post_filter阶段返回的Top-K结果执行第二个查询。每个分片上将检查的文档数量可以通过window_size参数控制,默认值为10。

默认情况下,原始查询和rescore查询的分数将线性组合,以生成_score每个文档的最终结果。原始查询和rescore查询的相对重要性可以 分别用query_weight和控制rescore_query_weight。两者都默认为1

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : {
      "window_size" : 50,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }
}
分数模式描述

total

添加原始分数和rescore查询分数。默认值。

multiply

将原始分数乘以rescore查询分数。对function query重新调整有用。

avg

平均原始分数和rescore查询分数。

max

取最大原始分数和rescore查询分数。

min

取最小原始分数和rescore查询分数。

Scroll

search请求返回结果的单个“页面”时,scroll API可用于从单个搜索请求中检索大量结果(甚至所有结果),这与在传统数据库上使用游标的方式非常相似。

scroll不是针对实时用户请求,而是针对处理大量数据,例如为了将一个索引的内容重新索引到具有不同配置的新索引中。

POST /twitter/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
DELETE /_search/scroll
{
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
DELETE /_search/scroll/_all
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB

Multi Search API

多搜索API允许在同一API中执行多个搜索请求。它的端点是_msearch

请求的格式类似于批量API格式,并使用换行符分隔的JSON(NDJSON)格式。结构如下(如果特定搜索最终重定向到另一个节点,则结构被特别优化以减少解析):

header \ n 
body \ n 
header \ n 
body \ n
GET twitter/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}

使用模板

GET _msearch/template
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match\": { \"message\" : \"{{keywords}}\" } } } }", "params": { "query_type": "match", "keywords": "some message" } }
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match_{{template}}\": {} } }", "params": { "template": "all" } }

转载于:https://my.oschina.net/u/4008390/blog/2874062

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值