我找不到使用ElasticSearch执行以下操作的方法:
每个项目都有一个玩家的名字作为属性。 这些玩家的在线状态每15分钟变化一次,可能是真的,也可能是假的(显然)。
我希望只能显示在线玩家的项目。
我不认为我可以使用该项目索引在线状态,因为它经常变化。 我无法真正获得在线玩家的所有ID并将其用作过滤器,因为它有很多。
对ElasticSearch中的玩家进行索引也有帮助吗?是否可以使用其他索引进行某种JOIN
?
编辑:在详细了解如何与ES结合之后,我发现如果我在ES中为玩家编制索引,实际上可以使用has_child。轮胎没有has_child
的方法,但可以用现有的DSL做到吗?
答案 0 :(得分:2)
即使您不需要对父文档进行全文搜索,似乎也非常适合玩家和项目之间的父子关系,因为:
您也可以在与项目相同的索引中为您的玩家编制索引,但在单独的类型中。您需要在映射中声明玩家类型为项目类型的parent:
{
"item":{
"_parent":{
"type" : "player"
}
}
}
之后你为玩家编制索引,然后你的项目指定每个玩家的父玩家ID。
然后,您可以对这些项目执行全文搜索,并使用以下has_parent filter对其进行过滤。
{
"has_parent" : {
"parent_type" : "player",
"query" : {
"term" : {
"status" : true
}
}
}
}
这样您只会查询并最终返回属于活动播放器的项目。
为了更新播放器,您可以使用update API并使用脚本来避免重新发送整个文档。请注意,文档将被删除并重新编制索引,这就是lucene的工作方式。
如果您想查看有关elasticsearch中文档之间关系的更多示例,请查看以下文章:
根据您将需要的查询类型,您可能会遇到限制,但鉴于您所写的内容,这就是我要做的。只需确保您的节点有足够的内存,因为elasticsearch在内存中保留了一个连接表,其中包含使用父子时所涉及的所有ID。