在索引中有一组ES文档,例如
{
currId: '<some id>',
prevId: '<some id>',
parents: ['NULL']
}
其中(为了简化此示例问题)当只有一个父项时使用prevId
,否则使用parents
(实际上还有其他原因,为什么它是这样的设计)。
所以像
这样的一组文件{currId: '0', prevId: 'NULL', parents: ['NULL']}
{currId: '1', prevId: '0', parents: ['NULL']},
{currId: '2', prevId: '0', parents: ['NULL']},
{currId: '3', prevId: 'NULL', parents: ['1', '2']},
{currId: '4', prevId: 'NULL', parents: ['1', '2']}
暗示图表
|-- 1 -- |__3
0-- |__
|-- 2 -- | 4
(对不起,如果ascii艺术不是很好(在单词中:0是1和2的父母,它们都是3和4的父母))。基本上,每个节点都有两个字段,这两个字段组合在一起,包含该节点父节点的完整列表。 请注意,索引中可能还有其他文档没有与此处显示的图表相关联,我希望在查询中忽略。
非常新的ES,所以很难想到哪里开始考虑这个问题。有没有一种方法可以查询,只使用该组件中的单个,随机文档的知识来获取组成连接组件图的所有文档(不一定是在该组件中以零为根的图形)上面的例子)(例如,只给出一个随机选择的节点的信息,获得所有其他连接的节点)?
**请注意,这是在通过axios(https://github.com/axios/axios)向ES服务器发送的JavaScript REST API请求中完成的,所以可以想象使用for-loops之类的东西(但我试图避免这种情况)如果可能的话,只使用一个查询(尽管我确实不知道这里会有什么样的权衡取舍))。
答案 0 :(得分:0)
要查找第一个度数连接,带有should子句的布尔查询就足够了。例如:
{
"query": {
"bool": {
"should": [
{"term": {"prevId":0}},
{"term": {"parents":0}}
]
}
}
}
答案 1 :(得分:0)
由于JavaScript比Elasticsearch查询语言更习惯使用JavaScript,因此我最终只使用了带有简单ES查询的DFS实现(this the trick),以将所有节点连接到单个选定的节点{{1} }一个DFS运行以获取所有的父母(和其他祖先),另一个DFS运行以获取所有的孩子。下面显示了代码(它有点冗长,但是要注意的主要功能是this.selectedNode
和buildGraph
以便在此处获得算法要点(也请注意,使用字段 sources 而不是问题中的父母)):
_dfs