Elasticsearch:文档关系

时间:2016-01-26 16:39:33

标签: elasticsearch

我正在进行弹性搜索自动填充 - 就像你一样 我使用像ngram和其他东西这样的很酷的功能来创建所需的分析器。

目前我打破了跟随数据的索引。 假设我有付款方式, 这种类型的每个文档都是这样的

{
 ..elastic meta data..
 paymentId: 123453425342,
 providerAccount : {
   id: 123456
   firstName: Alex,
   lastName: Web
 },
 consumerAccount : {
   id: 7575757,
   firstName: John,
   lastName: Doe
 },
 amount: 556,
 date : 342523454235345 (some unix timestamp)
}

所以基本上这份文件不仅代表支付本身,而且还代表支付关系,即与支付相关的2个实体。 付款始终有其提供者和消费者。 我在付款文档中需要这些数据,因为我想在UI中显示它。

通过对其进行索引,处理Consumer或Provider的更新可能会非常痛苦,因为每次更改其属性时我都必须更新具有此实体的所有付款。

另一种可能的解决方案是仅存储此消费者/提供商的ID并对付款进行查询,然后对实体进行2次查询以检索所需字段,但我对此不确定,因为我和#39;每次输入一个字符时都会执行ajax请求,因此性能问题就出现了。

我也研究了父母/子女关系解决方案,它基本上适合我的情况但我无法弄清楚在查询孩子(支付)时是否还可以检索父(消费者/提供者)字段。

你会建议什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,您可以在使用has_child查询孩子时检索父级。 将payment视为child而将consumer视为parent,您可以按以下方式搜索所有消费者:

GET /index_name/consumer/_search
{
"query": {
"has_child": {
  "type": "payment",
  "query": {
    // any query on payment table
   },
   "inner_hits": {}
  }
 }
}

这会根据您孩子的payment查询根据您的情况获取所有消费者。 inner_hits正是您要找的。这也将检索你的孩子。但它是在elasticsearch 1.5.0中引入的。所以版本应该大于elasticsearch 1.5.0。 您可以参考https://www.elastic.co/blog/elasticsearch-1-5-0-released

答案 1 :(得分:0)

您的问题不是问题。我想你想在付款后冻结数据,对吗?因此,您无需更新现有付款单据中的帐户数据。

此外:parent / schild易于更新,但查询效率较低。要自动完成,请继续使用当前的映射!