Search your data
这里有两个比较有用的参数需要注意一下
Search timeout
:设置每个分片的搜索超时时间。从集群级别可以通过search.default_search_timeout
来设置超时时间。如果在search.default_search_timeout
设置的时间段内未完成搜索请求,就会取消该任务。search.default_search_timeout
的默认值为-1
,表示无超时时间限制。
GET /my-index-000001/_search
{
"timeout": "2s",
"query": {
"match": {
"user.id": "kimchy"
}
}
}
track_total_hits
:设置搜索过程中匹配文档的数量。如果需要匹配所有文档,track_total_hits
设置为true
,如果需要匹配的文档为 1000 条,则track_total_hits
设置为1000
。数据量大时track_total_hits
设置为true
会拖慢查询速度。
GET my-index-000001/_search
{
"track_total_hits": true,
"query": {
"match" : {
"user.id" : "elkbee"
}
}
}
注意:
这强调一下 Response 中的 took
。took
代表处理该请求所耗费的毫秒数。从节点收到查询后开始,到返回客户端之前,包括在线程池中等待、在集群中执行分布式搜索和收集、排序所有结果所花费的时间。
一、Collapse search results
没看懂有啥用呢。。。考完试再研究
二、Filter search results
post_filter
:filter
过滤会将符合条件的文档留下,之后进行 聚合,而post_filter
是在聚合后过滤结果,不影响聚合结果。
# 创建索引,添加数据
PUT /shirts
{
"mappings": {
"properties": {
"brand": { "type": "keyword"},
"color": { "type": "keyword"},
"model": { "type": "keyword"}
}
}
}
POST /shirts/_bulk
{"index":{}}
{"brand": "gucci", "color": "red", "model": "slim"}
{"index":{}}
{"brand": "gucci", "color": "back", "model": "slim"}
{"index":{}}
{"brand": "gucci", "color": "back", "model": "large"}
直接使用 filter
GET /shirts/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "color": "red" }},
{ "term": { "brand": "gucci" }}
]
}
},
"aggs": {
"models": {
"terms": { "field": "model" }
}
}
}
使用 post_filter
GET /shirts/_search
{
"post_filter": {
"bool": {
"filter": [
{ "term": { "color": "red" }},
{ "term": { "brand": "gucci" }}
]
}
},
"aggs": {
"models": {
"terms": { "field": "model" }
}
}
}
rescore
:对每个分片的查询结果的前window_size
个文档重新评分。
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
}
}
}
三、Highlighting
从搜索结果中的一个或多个字段中获取高亮片段,并高亮显示,便于显示查询匹配的位置。
简单一点
GET my_index/_search
{
"query": {
"match": { "my_text": "GET" }
},
"highlight": {
"fields": {
"my_text": {"pre_tags" : ["<em>"], "post_tags" : ["</em>"]}
}
}
}
高亮显示可让您从搜索结果中的一个或多个字段中获取高亮片段,以便向用户显示查询匹配的位置。
四、Long-running searches
五、Near real-time search
六、Paginate search results
主要描述分页查询和深度查询,其中分页查询通过 from
和 size
来控制,这里将不再赘述。深度查询这里主要通过 Point in time(时间点) 和 Scroll search(滚动查询)这两种方法来实现。文档中更推荐使用 Point in time 配合 search_after
来实现。
- Point in time 配合
search_after
实现深度分页查询
# 创建时间点
POST /my-index-000001/_pit?keep_alive=1m
# Response
{
"id" : "8_LoAwEXa2liYW5hX3NhbXBsZV9kYXRhX2xvZ3MWTThSb1hDMUpSZS1EWnBuSjNtWG1sZwAWUmotTmxzRENUbXVCdGw0YVQyUGJPZwAAAAAAAAAEmBZBYjhlejFTQ1MxaWZLS1VST05NZnhBAAEWTThSb1hDMUpSZS1EWnBuSjNtWG1sZwAA"
}
# 利用
GET /_search
{
"size": 10,
"query": {
"term": {
"tags.keyword": {
"value": "success"
}
}
},
"pit": {
"id": "8_LoAwEXa2liYW5hX3NhbXBsZV9kYXRhX2xvZ3MWTThSb1hDMUpSZS1EWnBuSjNtWG1sZwAWeGZPTXRkbS1UX3lkd1ZsVzloVnlnZwAAAAAAAAAAfRZGSWlyWklWMlRsT05URnFocm9fakVBAAEWTThSb1hDMUpSZS1EWnBuSjNtWG1sZwAA",
"keep_alive": "1m"
},
"sort": [
{"timestamp": {"order": "asc", "format": "strict_date_optional_time_nanos", "numeric_type" : "date_nanos" }}
]
}
- Scroll search(滚动查询)实现深度分页查询
# 创建一个滚动查询
POST /kibana_sample_data_logs/_search?scroll=1m
{
"size": 100,
"slice": {
"id": 0,
"max": 2
},
"query": {
"match": {
"agent": "Mozilla"
}
}
}
# Response
{
"_scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFkFiOGV6MVNDUzFpZktLVVJPTk1meEEAAAAAAAAE6hZSai1ObHNEQ1RtdUJ0bDRhVDJQYk9n",
"took" : 5,
"timed_out" : false
...
}
# 通过滚动查询实现深度分页查询
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFkFiOGV6MVNDUzFpZktLVVJPTk1meEEAAAAAAAAE6hZSai1ObHNEQ1RtdUJ0bDRhVDJQYk9n"
}
七、Retrieve inner hits
八、Retrieve selected fields
九、Search across clusters
十、Search multiple data streams and indices
十一、Search shard routing
十二、Search templates
十三、Sort search results
对返回的结果排序。这里需要注意的是,_score
和 _doc
和 sort
中的被排序的字段的优先级一样,按照在 sort
中的排列顺序来排序。_score
表示文档的相似度得分,_doc
表示 _doc
的写入顺序。
GET /my_index/_search
{
"sort" : [
{ "@timestamp" : {"order" : "asc", "format": "strict_date_optional_time_nanos"}},
{ "my_other_field" : "desc" },
{ "my_field": "desc" },
"_score",
"_doc"
]
}
也支持对 数组类型的字段进行排序,通过 mode
来选择数组中的值。