Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/elasticsearch-search.html

Elasticsearch 查询索引


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 排序方式,可以是fieldNamefieldName: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_fetchquery_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查询流程详解