通过RESTful API进行Elasticsearch查询设计

时间:2015-04-22 21:20:58

标签: rest elasticsearch

我正在尝试构建一个查询,首先让我获取一个跟随用户的关注者列表,然后它应该获取该列表,然后检查它们是否“在线”。

我有两个'索引'或端点/频道和/跟随。

通道端点JSON对象看起来像这样(部分缩写)

{ channel: {"username":"username1", ... , "online":"true" } }

以下端点对象看起来有点像

{ following : {"username1":{"username2":"username2", "username3":"username3"} }

如果我运行一个简单的查询/在/ _search之后我会回复点击...

{
   "_index": "following",
   "_type": "following",
   "_id": "_Liso_",
   "_score": 1,
   "_source": {
   "Gabe": "Gabe",
      "Gavin": "Gavin"
   }
}

这个结果意味着Gavin跟随Gabe。

我认为问题在于我如何存储数据 在firebase中,我的数据看起来像这样

following
  |---Gabe
        |----Gavin:Gavin

因此,以下对象的每个子对象都具有{username}:{username}

的键/值子对象

现在,我可以运行单独获取所需结果的查询。例如,如果我问ElasticSearch(ES),如果频道“Gavin”是“在线”,我会取回一个结果,具体取决于他们是否在线。和跟随一样。但是,我似乎无法获得查询,先查看谁在关注Gavin,然后查看他们是否在线并返回在线用户。

1 个答案:

答案 0 :(得分:0)

我找到了更好的解决方案(或许不是)。首先,您在数据库中查询跟随用户的用户。

从此列表中发送另一个查询

{
"query":{

    "filtered":{
        "query":{
            "match_all":{}
        },
        "filter":{
            "bool":{
                "must":{
                    "terms":{
                        "username":["username1"]
                    }
                },
                "must_not":{
                    "terms":{
                        "online":["true"]
                    }
                }
            }
        }
    }
}
}

但这不起作用,但用户名不能与capitols混合使用。我不知道这是否是我的索引问题,或者条款必须非常具体。我在客户端使用的解决方案是在提交之前将搜索条件小写。它原油和hacky但它​​现在有效。

我可能遇到的问题:

  1. 如果用户有数百万的关注者从中提取所有数据 数据库会让客户端变得迟钝
    • 一个可能的解决方案是对以下结果进行分页,并为每20个返回的结果运行查询。
  2. 在开发/学习更好的查询方法时,我会继续修改答案。