基于RESTful API的Elasticsearch查询设计
我正在尝试构建一个查询,首先让我获得一个跟踪用户的追随者列表,然后它应该获取该列表,然后检查他们是否“在线” 我有两个“索引”或端点/通道和/或后续 通道端点JSON对象如下所示(部分缩写) 下面的endpoint对象看起来有点像这样基于RESTful API的Elasticsearch查询设计,rest,
elasticsearch,Rest,
elasticsearch,我正在尝试构建一个查询,首先让我获得一个跟踪用户的追随者列表,然后它应该获取该列表,然后检查他们是否“在线” 我有两个“索引”或端点/通道和/或后续 通道端点JSON对象如下所示(部分缩写) 下面的endpoint对象看起来有点像这样 { following : {"username1":{"username2":"username2", "username3":"username3"} } following |---Gabe |----Gavin:Gavin 如果我运
{ following : {"username1":{"username2":"username2", "username3":"username3"} }
following
|---Gabe
|----Gavin:Gavin
如果我运行一个简单的查询/跟踪/_搜索,我会得到像
{
"_index": "following",
"_type": "following",
"_id": "_Liso_",
"_score": 1,
"_source": {
"Gabe": "Gabe",
"Gavin": "Gavin"
}
}
这一结果意味着加文正在追随加布
我认为问题在于如何存储数据。在firebase中,我的数据如下所示
{ following : {"username1":{"username2":"username2", "username3":"username3"} }
following
|---Gabe
|----Gavin:Gavin
因此,以下对象的每个子对象都有{username}的键/值子对象:{username}
现在我可以单独运行查询以获得所需的结果。例如,如果我询问ElasticSearch(ES)频道“Gavin”是否“在线”,我会根据它们是否在线返回一个结果。和下面一样。然而,我似乎无法让查询首先查看谁在跟踪Gavin,然后查看他们是否在线并返回那些在线的用户 我找到了一个更好的解决方案(或许不是)。首先,查询数据库中跟踪用户的用户 从该列表可以发送另一个查询
{
"query":{
"filtered":{
"query":{
"match_all":{}
},
"filter":{
"bool":{
"must":{
"terms":{
"username":["username1"]
}
},
"must_not":{
"terms":{
"online":["true"]
}
}
}
}
}
}
}
但用户名不能与capitols混合使用。我不知道这是否是我的索引问题,或者术语必须非常具体。我在客户端使用的解决方案是在提交搜索词之前将其小写。它很粗糙,但现在还可以用
我可能遇到的问题:
- 一种可能的解决方案是对以下结果进行分页,并对每20个返回的结果运行一次查询
随着我开发/学习更好的查询方法,我将继续修改答案 如果不提供映射,很难判断是否存在小写问题,但我认为是因为您将小写分析器应用于字段,而不是搜索。您可以了解有关分析器的更多信息,以及如何在默认分析器拆分处设置默认索引和搜索分析器,并将其转换为小写。如果您希望进行精确匹配(而不是部分匹配),则需要将映射设置为index=not_analysis。请参见此处的映射部分:是的,我看到了这一点,并且我已经启用了它。这让我有点困惑,但我最终还是明白了。我必须说,入门教程还有很多需要改进的地方。@marcinn实际上有一些东西类似于RESTful的东西,例如它使用curl-GET请求。如果我没有弄错的话,关键字“GET”来自RESTful。RESTful的定义使用了诸如GET、POST、PUT等术语。因此,实际上它与RESTful类似。@marcinn此外,它还使用了其他RESTful术语,例如PUT。在本例中,您可以更新数据。同样,与RESTful非常相似