【问题标题】:Combine (independent) indexes in elastic search在弹性搜索中组合(独立)索引
【发布时间】:2020-06-08 06:46:06
【问题描述】:

我在弹性搜索中有两个索引,我想在搜索中组合它们。

一个索引有一些文章,例如

(
    [id] => 25
    [name] => my test artcile
    [city] => [
           id => 123
    ]
)

第二个索引有城市名称,例如

(
    [id] => 123
    [name] => my city
)

因此,如果我在文章中进行搜索查询,我想要这样的结果,结果中也使用城市名称,例如

(
    [id] => 25
    [name] => my test artcile
    [city] => [
           id => 123
           name => my city
    ]
)

有没有办法做到这一点?否则我必须扩展文章的导入以直接添加城市名称,但首选方式是索引之间的连接。

【问题讨论】:

  • 搜索引擎并不真正适用于像 RDBMS 这样的 JOIN。最佳实践是对数据进行非规范化。也就是说,Elasticsearch 中对 JOIN 有一定程度的支持。看看这个,elastic.co/guide/en/elasticsearch/reference/current/…
  • @WinnieDaPooh 这是我第一次使用带有多个索引的elasticsearch,我希望有一种简单的方法可以将它们组合起来(就像你说的“JOIN”一样)。如果只有直接添加数据的选项……这是可能的。
  • 您正在寻找的正确术语是 JOIN,不,我认为没有简单的方法。我认为甚至没有办法。我链接的 JOIN 要求您在一个索引中进行适当的数据建模。如果您绝对必须将数据放在两个单独的索引中,您可以查看 Solr 的 Streaming Expression。

标签: elasticsearch join indexing


【解决方案1】:

Elasticsearch 无法/不支持在搜索时组合来自独立索引的文档。它通常通过应用程序端连接完成(您的应用程序向 Elasticsearch 发送 2 个请求:

  • 第一个检索匹配文档
  • 第二个用于检索您从第一个请求中返回的文档的国家/地区

Elasticsearch 的join 类型只允许连接相同索引的文档,而不是跨索引。 terms 查询可用于在另一个索引中查找值,以根据这些值过滤掉另一个索引中的文档。

如 cmets 部分所述,Elasticsearch 不是关系数据库,它只是带有一些基本功能,以支持关系处理。使用 RDBMS,您可以在查询时执行“昂贵的”连接,RDBMS 针对快速写入进行了优化(较小的实体、单一版本的事实、一次写入、支持事务等)。搜索引擎针对快速读取和搜索请求进行了优化,因此我们要求您预先执行“昂贵”的连接,并为您的非规范化文档编制索引。这通常是首选方法。

【讨论】:

  • 正如@WinnieDaPooh 已经说过的那样......不幸的是,无法在一个请求中获取数据,因此我们更喜欢将数据(此处为 id 和 name)直接放入索引的方式。跨度>
猜你喜欢
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多