ElasticSearch 空搜索与多索引多类型搜索

1. 空搜索

测试数据:

https://gist.github.com/clintongormley/8579281

1.1 搜索

最基本的搜索API是空搜索(empty search),它没有指定任何的查询条件,只返回集群索引中的所有文档:

curl -XGET 'localhost:9200/_search?pretty'

Java版本:

SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
SearchResponse response = searchRequestBuilder.get();

返回的结果如下:

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 10,
        "successful": 10,
        "failed": 0
    },
    "hits": {
        "total": 13,
        "max_score": 1.0,
        "hits": [
            {
                "_index": "gb",
                "_type": "tweet",
                "_id": "5",
                "_score": 1.0,
                "_source": {
                    "date": "2014-09-15",
                    "name": "Mary Jones",
                    "tweet": "However did I manage before Elasticsearch?",
                    "user_id": 2
                }
            },
            {
                "_index": "gb",
                "_type": "tweet",
                "_id": "13",
                "_score": 1.0,
                "_source": {
                    "date": "2014-09-23",
                    "name": "Mary Jones",
                    "tweet": "So yes, I am an Elasticsearch fanboy",
                    "user_id": 2
                }
            }
            // ...
        ]
    }
}

1.2 hits

返回结果中最重要的部分是 hits,它包含 total 字段来表示匹配到的文档总数,并且有一个 hits 数组包含所查询结果的前十个文档。

hits 数组中每个结果包含文档的 _index_type_id 以及 _source 字段。这意味着我们可以直接从返回的搜索结果中获取整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你自己单独去获取文档。

每个结果还有一个 _score 字段,这是一个相关性得分,它衡量了文档与查询文本的匹配程度。默认情况下,首先返回相关性最高的文档,就是说,返回文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果都是中性的 _score 为1。

max_score 是文档与查询文本匹配度最高的 _score

1.3 Took

took 告诉我们整个搜索请求执行多少毫秒数。

1.4 Shards

_shards 告诉我们参与查询的分片总数(total),有多少是成功的(successful),有多少的是失败的(failed)。

通常我们不希望分片失败,但是还是有可能发生。如果我们遭受一些重大故障,导致同一分片的主分片和副本分片都丢失,那么这个分片就不会响应搜索请求。这种情况下,Elasticsearch 将报告这个分片failed,但仍将继续返回剩余分片上的结果。

1.5 Timeout

time_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完整结果更重要,你可以将超时指定为 1010ms(10毫秒)或 1s(1秒):

curl -XGET 'localhost:9200/_search?timeout=10ms'

在请求超时之前,ElasticSearch 将返回从每个分片收集到的任何结果。

应当注意的是 timeout 不是停止执行查询,仅仅是告知协调节点返回到目前为止收集到的结果并关闭连接。在后台,其他的分片可能仍在执行查询,即使结果已经发送了。

使用超时是因为对你的 SLA(服务等级协议)来说很重要的,而不是因为想去中止长时间运行的查询。

2. 多索引和多类型搜索

如果不对我们的搜索做出特定索引或者特定类型的限制,就会搜索集群中的所有文档。Elasticsearch 将搜索请求并行转发到每一个主分片或者副本分片上,收集结果以选择全部中的前10名,并且返回给我们。

但是,通常,我们希望在一个或多个特定索引中搜索,也可能需要在一个或多个特定类型上搜索。我们可以通过在 URL 中指定索引和类型来执行此操作,如下所示:

搜索

描述

/_search

在所有的索引中对所有类型进行搜索

/gb/_search

在gb索引中对所有类型进行搜索

/gb,us/_search

在gb和us索引中对所有类型进行搜索

/g*,u*/_search

在以g或者u开头的索引中对所有类型进行搜索

/gb/user/_search

在gb索引中对user类型进行搜索

/gb,us/user,tweet/_search

在gb和us索引中对user和tweet类型进行搜索

/_all/user,tweet/_search

在所有的索引中对user和tweet类型进行搜索

Java版本:

SearchRequestBuilder searchRequestBuilder = client.prepareSearch();
searchRequestBuilder.setIndices("*index");
SearchResponse response = searchRequestBuilder.get();

从下面源码中,我们可以知道,设置索引和类型的方法参数是可变参数,因此我们可以设置多个索引或者类型。

public SearchRequestBuilder setIndices(String... indices) {
    request.indices(indices);
    return this;
}
public SearchRequestBuilder setTypes(String... types) {
    request.types(types);
    return this;
}

当在单个索引中搜索时,Elasticsearch 将搜索请求转发到该索引中每个分片的主分片或副本分片上,然后从每个分片收集结果。在多个索引中搜索的方式完全相同 - 只是会涉及更多的分片。

搜索一个具有五个主分片的索引完全等同于搜索每个具有一个主分片的五个索引。

原文:https://www.elastic.co/guide/en/elasticsearch/guide/2.x/empty-search.html

https://www.elastic.co/guide/en/elasticsearch/guide/2.x/multi-index-multi-type.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏没有故事的陈师傅

elk+filebeat+grafana日志收集平台学习笔记

node1:elasticsearch6.4+filebeat node2:kibana6.4+grafana+filebeat node3:logstash+...

59720
来自专栏没有故事的陈师傅

Elastic Stack 日志收集系统笔记

elasticstack是一个应用套件,原名为ELK Stack,由elastic旗下的elasticsearch、logstash、kibana,filebe...

13620
来自专栏Web技术布道师

10 分钟快速搭建 ELK 日志分析系统

https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

13520
来自专栏没有故事的陈师傅

使用LNMP搭建Zabbix并对接Elasticsearch

不然修改密码之后密码会过期,会提示让你重新设置密码 You must reset your password using ALTER USER statemen...

16940
来自专栏猿天地

脑裂是什么?Zookeeper是如何解决的?

脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致...

61250
来自专栏王念博客

elasticsearch之基础

Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它可以在很短的时间内存储,搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核...

7820
来自专栏宜信技术实践

大数据可视平台Davinci的安装与配置攻略

1) 初始化目录,将下载好的 Davinci 包(Release 包,不是 Source 包)解压到某个系统目录,如:~/app/davinci

80540
来自专栏zhisheng

看完这篇还不会 Elasticsearch,我跪搓衣板!

搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种:

16120
来自专栏王念博客

Logstash收集日志

logstash是一种分布式日志收集框架,开发语言是JRuby,当然是为了与Java平台对接,不过与Ruby语法兼容良好,非常简洁强大,经常与ElasticSe...

33110
来自专栏没有故事的陈师傅

Elastic Stack日志收集系统笔记 (logstash部分)

Logstash管道有两个必需的元素,input和output,以及一个可选的元素filter。输入插件使用来自源的数据,过滤器插件在您指定时修改数据,输出插件...

24330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励