我正在进行弹性搜索自动填充 - 就像你一样 我使用像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请求,因此性能问题就出现了。
我也研究了父母/子女关系解决方案,它基本上适合我的情况但我无法弄清楚在查询孩子(支付)时是否还可以检索父(消费者/提供者)字段。
你会建议什么?
谢谢!
答案 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易于更新,但查询效率较低。要自动完成,请继续使用当前的映射!