elasticsearch通过顶部多索引,实现联合查询

一、前言

      之前试了下多索引查询,就是索引以数组的方式进行查询,发现这种方式是可以的。但是如果两个索引的名字,字段都不相同,可以实现类似于mysql的那种join效果吗,试试吧

elasticsearch的多索引联合查询以及范围日期查询示例

背景:使用es-php + es7.0

二、正文

1、首先索引部分还是以数组的形式

 'index' => ['zeusa.evony.com.accesslog-2019.03.28','zeusa.evony.com.accesslog-2019.03.29','users'],

2、进行普通查询

这一步发现了问题,就是如果要根据条件查询的话,那么多个索引之间必须有相同的条件字段才行,总结就是:
(1)、写法就是用数组的方式
(2)、注意type必须保持一致,不然会查不到
(3)、如果有条件,那么条件字段要保证每个索引中都有
(4)、查询出来的代码如下:

   [89]=>
      array(5) {
        ["_index"]=>
        string(5) "user1"
        ["_type"]=>
        string(3) "doc"
        ["_id"]=>
        string(20) "6CgEWGoBSw5ta76v3QnC"
        ["_score"]=>
        float(1)
        ["_source"]=>
        array(2) {
          ["@timestamp"]=>
          string(20) "2019-03-28T11:23:52Z"
          ["user_id"]=>
          int(299)
        }
      }
      [90]=>
      array(5) {
        ["_index"]=>
        string(36) "accesslog-2019.03.28"
        ["_type"]=>
        string(3) "doc"
        ["_id"]=>
        string(20) "3yEKxGkB18T84ql3g4oq"
        ["_score"]=>
        float(1)
        ["_source"]=>
        array(1) {
          ["@timestamp"]=>
          string(24) "2019-03-28T11:23:36.020Z"
        }
      }

3、优缺点

      可以看出来是两个索引下的数据,查出来之后是分散的数组。对于这种查询方式,最佳的用法是不同索引的结构完全相同,比如日志索引access_20190426access_20190427,这种结构相同的情况下,进行多索引联合查询是很合适的。

优点:

1、 对结构相同或者大部分字段相同的索引,可以使用这种方式进行多索引联合查询
2、 直接查询出来的就是数组,根据索引名处理下数组即可。还可以直接在查询出来的基础上进行聚合操作

缺点:

1、 如果索引的字段不同,就比如这里的user1和accesslog-2019.03.28,查询结果是出来了,但是如果要进行聚合操作,那么只能各自聚合各自的字段,不能进行子聚合。
2、 查询条件必须同时符合多个索引,但在业务层面,比如mysql的联表查询中,并不是要求每个表都必须遵循相同的查询条件的,可能只是a.id=b.id的关联关系。

三、如果要实现类似于mysql的联合查询

      首先,我们都知道,mysql做联合查询,表的字段都是有关联的,那么使用上面这种方式肯定是不行的,或者局限性很大。不可能让关联的索引保持字段都一致,业务上也说不过去。

1、网上的方案

网上的方案一般分为四种,这里参考: https://blog.youkuaiyun.com/laoyang360/article/details/79774481
(1)、应用端关联
(2)、宽表冗余存储(Data denormalization)
(3)、嵌套文档(Nested)存储
(4)、父子文档存储

      如果数据量不是很大的话,使用客户端join,也就是在业务层面查询两次也能实现类似于join的操作。如果数据量适中,多个索引之间联系紧密,比如博客和评论的关系,那么是可以考虑Nested&Join方式的,只是比较影响性能。nested 类型检索使得检索效率慢几倍,父子Join 类型检索会使得检索效率慢几百倍。

      如果你多索引是类似于博客表和用户表关联,关系不是很紧密且数据量很大的话,最好是采用宽表的方式。如果业务端对查询性能要求很高的话,还是建议使用宽表化处理的方式,这样也可以比较好地应对聚合的需求。在索引阶段需要做join处理,查询阶段可能需要做去重处理,分页方式可能也得权衡考虑下。

2、其次

      我们要知道,ES和大多数的nosql相似,想要处理mysql这种关联关系还是有些强人所难了。最好是在设计阶段就尽量设计成扁平化的文档模型,用拼接json的方式去处理数据,而不是还按照传统关系型数据库的思维去使用ES。性能和关联关系不可兼得,ES既然选择了性能,那就别嫌弃它处理关联不方便吧。

      博主的需求是分析日志于用户之间的关系,最终选用的方案是宽表模式,也就是咱们常说的数据冗余。毕竟数据量挺大的,采用其他方案都很影响效率。这个大家仁者见仁智者见智了,总之要改变自己的思维,关联起来太难了!

end

### 回答1: 要实现 Elasticsearch 多索引联合查询,可以使用 Elasticsearch多索引查询功能。具体来说,可以使用 Elasticsearch 的 Multi-Search API 进行多个查询操作,然后将结果合并起来返回给用户。 以下是一个简单的示例代码,假设有两个索引 index1 和 index2,需要联合查询: ``` POST /_msearch {} {"index": "index1"} {"query": {"match_all": {}}} {} {"index": "index2"} {"query": {"match_all": {}}} ``` 上述代码中,`_msearch` 是 Multi-Search API,`index1` 和 `index2` 是要查询的两个索引,`match_all` 是一个简单的查询语句,表示匹配所有文档。查询结果会按照查询顺序依次返回,需要自行解析和处理。 需要注意的是,多索引联合查询可能会带来一些性能问题,特别是在大数据量场景下。因此,需要根据实际情况进行权衡和优化。 ### 回答2: Elasticsearch是一个分布式搜索引擎,可以用于存储、搜索和分析大规模的数据集合。在Elasticsearch中,我们可以使用多索引联合查询实现对多个索引中的数据进行查询和分析。 多索引联合查询Elasticsearch中非常常见和重要。当我们有多个索引,每个索引包含不同类型或字段的数据时,我们可以使用多索引联合查询来同时搜索这些索引,并获取跨多个索引的结果。 使用多索引联合查询的步骤如下: 1. 创建索引:首先,我们需要创建多个索引,并将不同类型或字段的数据分别存储在这些索引中。 2. 查询语句:在进行多索引联合查询之前,我们需要构建一个查询语句。查询语句可以使用Elasticsearch提供的查询DSL(Domain Specific Language)来编写,通过指定不同的索引名称、查询条件和过滤条件来实现。 3. 查询执行:一旦查询语句准备好,我们可以将其发送到Elasticsearch服务器进行查询执行。Elasticsearch会同时搜索多个索引,并返回跨多个索引的结果。 4. 结果处理:最后,我们可以对查询结果进行处理和分析。可以根据需要,对结果进行排序、筛选、聚合等操作多索引联合查询在实际的应用场景中非常有用。例如,当我们的数据被分散存储在不同的索引中,需要同时查询和分析这些数据时,我们可以使用多索引联合查询来快速获取所需的结果。 总结而言,Elasticsearch提供了多索引联合查询的功能,可以方便地搜索和分析跨多个索引的数据。通过构建查询语句、执行查询并处理结果,我们可以快速获取我们所需的数据。 ### 回答3: Elasticsearch是一种开源的分布式搜索引擎,它可用于实现全文搜索、日志分析、数据可视化和实时数据分析等功能。在Elasticsearch中,可以通过多索引联合查询来同时搜索多个索引并获取结果。 多索引联合查询可以通过以下几种方式实现: 1. 使用多个索引名称:可以在查询语句中指定多个索引名称,用逗号分隔。例如,可以使用以下语句同时查询index1和index2两个索引: GET index1,index2/_search { "query": { "match": { "field": "value" } } } 2. 使用通配符查询多个索引:可以使用通配符在查询语句中匹配多个索引名称。例如,可以使用以下语句查询所有以"index"开头的索引: GET index*/_search { "query": { "match": { "field": "value" } } } 3. 使用别名查询多个索引:在创建索引时,可以为索引设置一个别名,然后在查询中使用别名来查询多个索引。例如,可以使用以下语句创建两个索引并为它们设置别名: PUT index1/_alias/myalias PUT index2/_alias/myalias 然后,可以使用以下语句查询myalias别名所对应的索引: GET myalias/_search { "query": { "match": { "field": "value" } } } 多索引联合查询可以帮助我们在一个请求中同时搜索多个索引,提高查询效率和性能。在进行多索引联合查询时,需要注意索引之间的数据结构和映射是否一致,以保证查询结果的准确性和一致性。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值