Elasticsearch 的最多使用的场景就是用它的查询 API,它提供完备的查询功能以满足现实中的各种需求。
多个 index、多个 type 查询
Elasticsearch的搜索api支持一个索引(index)的多个类型(type)查询以及多个索引(index)的查询。
例如,我们可以搜索 twitter 索引下面所有匹配条件的所有类型中文档,如下:
GET /twitter/_search?q=user:shay
我们也可以搜索一个索引下面指定多个 type 下匹配条件的文档,如下:
GET /twitter/tweet,user/_search?q=user:banon
我们也可以搜索多个索引下匹配条件的文档,如下:
GET /twitter,elasticsearch/_search?q=tag:wow
此外我们也可以搜索所有索引下匹配条件的文档,用_all 表示所有索引,如下:
GET /_all/_search?q=tag:wow
甚至我们可以搜索所有索引及所有 type 下匹配条件的文档,如下:
GET /_search?q=tag:wow
URI 搜索
Elasticsearch 支持用 uri 搜索,可用 get 请求里面拼接相关的参数,并用 curl 相关的命令就可以进行测试。
如下有一个示例:
GET twitter/_search?q=user:kimchy
如下是上一个请求的相应实体:
{
"timed_out": false,
"took": 62,
"_shards":{
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits":{
"total" : 1,
"max_score": 1.3862944,
"hits" : [
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "0",
"_score": 1.3862944,
"_source" : {
"user" : "kimchy",
"date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch",
"likes": 0
}
}
]
}
}
参数选项
URI 中允许的参数:
名称 | 描述 |
---|---|
q | 查询字符串,映射到query_string查询 |
df | 在查询中未定义字段前缀时使用的默认字段 |
analyzer | 查询字符串时指定的分词器 |
analyze_wildcard | 是否允许通配符和前缀查询,默认设置为false |
batched_reduce_size | 应在协调节点上一次减少的分片结果数。如果请求中潜在的分片数量很大,则应将此值用作保护机制,以减少每个搜索请求的内存开销 |
default_operator | 默认使用的匹配运算符,可以是AND或者OR,默认是OR |
lenient | 如果设置为true,将会忽略由于格式化引起的问题(如向数据字段提供文本),默认为false |
explain | 对于每个hit,包含了具体如何计算得分的解释 |
_source | 请求文档内容的参数,默认true;设置false的话,不返回_source字段,可以使用_source_include和_source_exclude参数分别指定返回字段和不返回的字段 |
stored_fields | 指定每个匹配返回的文档中的存储字段,多个用逗号分隔。不指定任何值将导致没有字段返回 |
sort | 排序方式,可以是fieldName、fieldName:asc或者fieldName:desc的形式。fieldName可以是文档中的实际字段,也可以是诸如_score字段,其表示基于分数的排序。此外可以指定多个sort参数(顺序很重要) |
track_scores | 当排序时,若设置true,返回每个命中文档的分数 |
track_total_hits | 是否返回匹配条件命中的总文档数,默认为true |
timeout | 设置搜索的超时时间,默认无超时时间 |
terminate_after | 在达到查询终止条件之前,指定每个分片收集的最大文档数。如果设置,则在响应中多了一个terminated_early的布尔字段,以指示查询执行是否实际上已终止。默认为no terminate_after |
from | 从第几条(索引以0开始)结果开始返回,默认为0 |
size | 返回命中的文档数,默认为10 |
search_type | 搜索的方式,可以是dfs_query_then_fetch或query_then_fetch。默认为query_then_fetch |
allow_partial_search_results | 是否可以返回部分结果。如设置为false,表示如果请求产生部分结果,则设置为返回整体故障;默认为true,表示允许请求在超时或部分失败的情况下获得部分结果 |
查询流程
在 Elasticsearch 中,查询是一个比较复杂的执行模式,因为我们不知道那些 document 会被匹配到,任何一个 shard 上都有可能,所以一个 search 请求必须查询一个索引或多个索引里面的所有 shard 才能完整的查询到我们想要的结果。
找到所有匹配的结果是查询的第一步,来自多个 shard 上的数据集在分页返回到客户端之前会被合并到一个排序后的 list 列表,由于需要经过一步取 top N 的操作,所以 search 需要进过两个阶段才能完成,分别是 query 和 fetch。
关于Elasticsearch的查询详细流程可转到Elasticsearch查询流程详解。