基础搜索
搜索API允许您执行搜索查询并取回与查询匹配的搜索匹配。可以使用简单的查询字符串作为参数
或使用
查询。
请求主体来提供
示例:
GET /sfeicuss/_search?service=wangzha.query
多种类型搜索
:
GET /sfeicuss/testlog,testservicelog/_search?service=wangzha.query
多索引搜索
:
GET /sfeicuss,ees/testlog/_search?service=wangzha.query
_all 占位符搜索
所有可用索引中的所有内容:
GET /_all/testlog/_search?service=wangzha.query
URL快速搜索
通过提供请求参数,可以纯粹使用URI执行搜索请求。在使用此模式执行搜索时,并非所有搜索选项都显示,但对于快速“卷曲测试”可能非常方便。
GET Twitter / tweet / _search?q =service:wangzha.query
URI中允许的参数是:
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
仍然可以跟踪分数并将它们作为每次击中的一部分返回。
timeout
搜索超时,限制在指定时间值内执行的搜索请求,并在到期时积累至该点的保留时间。默认没有超时。
terminate_after
为每个分片收集的文档的最大数量,一旦达到该数量,查询执行将提前终止。如果设置,则响应将有一个布尔型字段terminated_early
来指示查询执行是否实际已经terminate_early
。缺省为no terminate_after
。
from
从命中的索引开始返回。默认为0。
size
要返回的点击次数。默认为10。
search_type
要执行的搜索操作的类型。可以是 dfs_query_then_fetch
或query_then_fetch。
默认为query_then_fetch
。有关可以执行的不同搜索类型的更多详细信息,请参阅 搜索类型。
搜索请求体
GET sfeicuss/servicelog/_search
{
"query":{
"term": {
"service": "wangzha.company"
}
}
}
部分返回结果:
{
"took": 88,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 5,
"max_score": 0.2876821,
"hits": [
{
"_index": "sfeicuss",
"_type": "servicelog",
"_id": "5",
"_score": 0.2876821,
"_source": {
"id": "1",
"service": "wangzha.company",
"appCode": "cms",
"source": "yidong",
"serviceResponseCode": "00004",
"bizResponseCode": "0",
"requestTime": "",
"responseTime": ""
}
},
timeout
搜索超时,限制在指定时间值内执行的搜索请求,并在到期时积累至该点的保留时间。默认没有超时。请参阅时间单位编辑。
from
从特定偏移量检索匹配。默认为0
。
size
要返回的点击次数。默认为10
。如果您不关心是否获得一些点击率,而只是关于匹配和/或聚合的数量,则将值设置为0有助于提升性能。
search_type
要执行的搜索操作的类型。可以是 dfs_query_then_fetch
或query_then_fetch
。默认为query_then_fetch
。
request_cache
设置为true
或false
启用或禁用请求的搜索结果,其中的缓存size为0
,即聚合和建议(无排名靠前返回)。
terminate_after
为每个分片收集的文档的最大数量,一旦达到该数量,查询执行将提前终止。如果设置,则响应将有一个布尔型字段terminated_early
来指示查询执行是否实际已经terminate_early
。缺省为no terminate_after
。
batched_reduce_size
一次在协调节点上应该减少的分片结果的数量。如果请求中的潜在分片数量可能很大,则应将此值用作保护机制以减少每个搜索请求的内存开销。
注意:
1、search_type
和request_cache
必须作为查询字符串参数传递。搜索请求的其余部分应该在主体内传递。主体内容也可以作为名为REST的参数传递source。
2、HTTP GET
和HTTP POST
都可以用于执行搜索正文。由于并非所有客户端都支持GET
,因此POST
也是允许的。
快速检索任何匹配的文档:
如果我们只想知道是否有与特定查询匹配的文档,我们可以将其size
设置0
为表示我们对搜索结果不感兴趣。此外,我们可以设置terminate_after
为1
指示只要找到第一个匹配文档(每个分片)就可以终止查询执行。
GET / _search?q=message:elasticsearch&size=0&terminate_after=1
响应结果:
{
"took": 3,
"timed_out": false,
"terminated_early": true,
"_shards": {
"total": 1,
"successful": 1,
"skipped" : 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.0,
"hits": []
}
}
响应将不包含任何命中,因为size被设置为0。在 hits.total
将或者等于0,这表明没有匹配的文档,或者大于0这意味着至少有一样多的文档匹配查询时,它被提前终止。此外,如果查询被提前终止,该terminated_early
标志将被设置为true
响应中。
一些查询的示例:
分页查询
:结果分页可以通过使用from和size 参数来完成。该from参数定义了您想要获取的第一个结果的偏移量。该size参数允许您配置要返回的最大命中数量。
GET /_search
{
"from" : 0,"size" : 10,
"query" : {
"term" : { "user" : "kimchy" }
}
}
注意:from+ size
不能超过index.max_result_window
默认为10000
的索引设置。
排序
:允许在特定字段上添加一个或多个排序。每种排序都可以颠倒。排序是在每个字段级别上定义的,具有特殊字段名称用于_score
按分数排序,并按_doc
索引顺序排序。
假设以下索引映射:
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"post_date": { "type": "date" },
"user": {
"type": "keyword"
},
"name": {
"type": "keyword"
},
"age": { "type": "integer" }
}
}
}
}
GET /my_index/my_type/_search
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
"user",
{ "name" : "desc" },
{ "age" : "desc" },
"_score"
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
_doc
除了最有效的排序顺序之外,没有真正的用例。所以如果你不关心文件返回的顺序,那么你应该排序_doc
。这在滚动时特别有用。
排序顺序:该顺序默认为desc
在排序时;按_score
排序时,默认asc
排序。
Elasticsearch
支持按数组
或多值字段
进行排序。该mode选项控制选择何种数组值来对它所属的文档进行排序。该mode选项可以具有以下值:
min
:选择最低值。
max
:选择最高的价值。
sum
:使用所有值的总和作为排序值。仅适用于基于数字的数组字段。
avg
:使用所有值的平均值作为排序值。仅适用于基于数字的数组字段。
median
:使用所有值的中值作为排序值。仅适用于基于数字的数组字段。
排序示例一:
字段价格每个文档有多个价格。在这种情况下,结果匹配将根据每份文件的平均价格按价格上升进行排序。
PUT /my_index/my_type/1?refresh
{
"product": "chocolate",
"price": [20, 4]
}
POST /_search
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{"price" : {"order" : "asc", "mode" : "avg"}}
]
}
嵌套对象排序
:Elasticsearch
还支持通过一个或多个嵌套对象内的字段进行排序。通过嵌套字段支持进行排序在已有的排序选项之上具有以下参数:
nested_path
:定义要排序的嵌套对象。实际的排序字段必须是此嵌套对象内的直接字段。当按嵌套字段排序时,该字段是强制性的。
nested_filter
:一个过滤器,嵌套路径中的内部对象应该匹配,以便通过排序来考虑其字段值。常见的情况是在嵌套的过滤器或查询中重复查询/过滤器。默认情况下,no nested_filter
是活动的。
排序示例二:
在下面的例子中offer
是一个nested
类型的字段,nested_path
待指定的需要; 否则,elasticsearch
不知道需要捕获什么嵌套级别的排序值。
POST /_search
{
"query" : {
"term" : { "product" : "chocolate" }
},
"sort" : [
{
"offer.price" : {
"mode" : "avg",
"order" : "asc",
"nested_path" : "offer",
"nested_filter" : {
"term" : { "offer.color" : "blue" }
}
}
}
]
}
missing
参数指定如何其缺少字段文档应被视为:该missing
值可以被设置为_last
,_first
或自定义的值(将被用于缺少文档作为排序值)。默认是_last
。下面示例:
GET /_search
{
"sort" : [
{ "price" : {"missing" : "_last"} }
],
"query" : {
"term" : { "product" : "chocolate" }
}
}
默认情况下,如果没有与字段关联的映射,搜索请求将失败。该unmapped_type
选项允许忽略没有映射并且不能按照它们排序的字段。该参数的值用于确定要发出的排序值。这是一个如何使用它的例子:
GET /_search
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} }
],
"query" : {
"term" : { "product" : "chocolate" }
}
}
如果查询的任何索引都没有映射price
,那么Elasticsearch
将处理它,就好像存在类型映射一样, long
此索引中的所有文档都没有该字段的值。
允许基于自定义脚本进行排序,这里是一个例子:
GET /_search
{
"query" : {
"term" : { "user" : "kimchy" }
},
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "doc['field_name'].value * params.factor",
"params" : {
"factor" : 1.1
}
},
"order" : "asc"
}
}
}
追踪分数:在字段上排序时,不计算分数
。通过设置 track_scores
为true
,分数仍将被计算和跟踪。示例:
GET /_search
{
"track_scores": true,
"sort" : [
{ "post_date" : {"order" : "desc"} },
{ "name" : "desc" },
{ "age" : "desc" }
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
注意:
排序时,相关的排序字段值将加载到内存中
。这意味着每个分片应该有足够的内存来容纳它们。对于基于字符串的类型,不应分析/标记字段。对于数字类型,如果可能的话,建议将类型显式设置为更窄的类型(如short,integer和 float)。
总结,排序模式有如下:
- 基于数组或多个字段排序
- 嵌套排序
- 缺少值排序
- 忽略未映射字段排序
- 基于地理位置的排序
- 基于脚本的排序