本文参考官方提供api提炼出来的
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
URI查询
elasticsearch可以通过提供请求参数纯粹使用URI来执行搜索请求。
GET twitter/_search?q=user:kimchy
名称 | 描述 |
---|---|
| 查询字符串(映射到 |
| 在查询中未定义字段前缀时使用的默认字段。 |
| 分析查询字符串时要使用的分析器名称。 |
| 是否应分析通配符和前缀查询。默认为 |
| 应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。 |
| 要使用的默认运算符可以是 |
| 如果设置为true将导致忽略基于格式的失败(如向数字字段提供文本)。默认为false。 |
| 对于每个命中,包含如何计算命中得分的解释。 |
| 设置为 |
| 每个匹配返回的文档的选择性存储字段,逗号分隔。不指定任何值将导致没有字段返回。 |
| 排序执行。可以是 |
| 排序时,设置为 |
| 设置为 |
| 搜索超时,将搜索请求限制在指定的时间值内执行,并使用在到期时累积的点击数进行保释。默认为无超时。 |
| 在达到查询执行将提前终止时,为每个分片收集的最大文档数。如果设置,响应将具有一个布尔字段, |
| 从命中的索引开始返回。默认为 |
| 要返回的点击次数。默认为 |
| 要执行的搜索操作的类型。可以是 |
|
|
Requet Body搜索
Requet Body请求可以在其主体内使用包括查询DSL的搜索DSL来执行。
GET /twitter/_search
{
"query" : {
"term" : { "user" : "kimchy" }
}
}
| 搜索超时,将搜索请求限制在指定的时间值内执行,并使用在到期时累积的点击数进行保释。使用“ 搜索取消” 编辑机制在达到超时后取消搜索请求。默认为无超时。请参阅时间单位编辑。 |
| 从某个偏移量中检索命中。默认为 |
| 要返回的点击次数。默认为 |
| 要执行的搜索操作的类型。可以是 |
| 设置为 |
|
|
| 在达到查询执行将提前终止时,为每个分片收集的最大文档数。如果设置,响应将具有一个布尔字段, |
| 应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销。 |
Query
搜索请求主体中的查询元素允许使用查询DSL定义查询。
GET /_search { "query" : { "term" : { "user" : "kimchy" } } }
From/Size
结果的分页可以通过使用from
和size
参数来完成。该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
| 按升序排序 |
| 按降序排序 |
Elasticsearch支持按数组或多值字段进行排序。 mode选项控制选择哪个数组值以对其所属的文档进行排序。 mode选项可以具有以下值
| 选择最低值。 |
| 选择最高价值。 |
| 使用所有值的总和作为排序值。仅适用于基于数字的数组字段。 |
| 使用所有值的平均值作为排序值。仅适用于基于数字的数组字段。 |
| 使用所有值的中位数作为排序值。仅适用于基于数字的数组字段。 |
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
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 } } }
分数模式 | 描述 |
---|---|
| 添加原始分数和rescore查询分数。默认值。 |
| 将原始分数乘以rescore查询分数。对 |
| 平均原始分数和rescore查询分数。 |
| 取最大原始分数和rescore查询分数。 |
| 取最小原始分数和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" } }