如何过滤未在ElasticSearch中编制索引的外部数据

时间:2013-04-20 14:42:20

标签: search join elasticsearch tire

我找不到使用ElasticSearch执行以下操作的方法:

  • 我在ElasticSearch
  • 中编入了2,000,000个项目
  • 我在MySQL中保存了30,000名玩家

每个项目都有一个玩家的名字作为属性。 这些玩家的在线状态每15分钟变化一次,可能是真的,也可能是假的(显然)。

我希望只能显示在线玩家的项目。

我不认为我可以使用该项目索引在线状态,因为它经常变化。 我无法真正获得在线玩家的所有ID并将其用作过滤器,因为它有很多。

对ElasticSearch中的玩家进行索引也有帮助吗?是否可以使用其他索引进行某种JOIN

编辑:在详细了解如何与ES结合之后,我发现如果我在ES中为玩家编制索引,实际上可以使用has_child。轮胎没有has_child的方法,但可以用现有的DSL做到吗?

1 个答案:

答案 0 :(得分:2)

即使您不需要对父文档进行全文搜索,似乎也非常适合玩家和项目之间的父子关系,因为:

  1. 每个项目属于一个玩家
  2. 他们拥有独立的更新生命周期:当玩家改变时,你不想重新索引他所有的物品
  3. 你只想归还孩子,过滤器给他们的父母。
  4. 您也可以在与项目相同的索引中为您的玩家编制索引,但在单独的类型中。您需要在映射中声明玩家类型为项目类型的parent

    {
      "item":{
        "_parent":{
          "type" : "player"
        }
      }
    }
    

    之后你为玩家编制索引,然后你的项目指定每个玩家的父玩家ID。

    然后,您可以对这些项目执行全文搜索,并使用以下has_parent filter对其进行过滤。

    {
        "has_parent" : {
            "parent_type" : "player",
            "query" : {
                "term" : {
                    "status" : true
                }
            }
        }
    }
    

    这样您只会查询并最终返回属于活动播放器的项目。

    为了更新播放器,您可以使用update API并使用脚本来避免重新发送整个文档。请注意,文档将被删除并重新编制索引,这就是lucene的工作方式。

    如果您想查看有关elasticsearch中文档之间关系的更多示例,请查看以下文章:

    根据您将需要的查询类型,您可能会遇到限制,但鉴于您所写的内容,这就是我要做的。只需确保您的节点有足够的内存,因为elasticsearch在内存中保留了一个连接表,其中包含使用父子时所涉及的所有ID。