用于获取图形邻接列表的所有节点的Elasticsearch查询(在javascript中构建图形)

时间:2018-06-15 02:23:59

标签: elasticsearch

在索引中有一组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之类的东西(但我试图避免这种情况)如果可能的话,只使用一个查询(尽管我确实不知道这里会有什么样的权衡取舍))。

2 个答案:

答案 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.selectedNodebuildGraph以便在此处获得算法要点(也请注意,使用字段 sources 而不是问题中的父母)):

_dfs