【问题标题】:How to filter by external data not indexed in ElasticSearch如何按未在 ElasticSearch 中索引的外部数据进行过滤
【发布时间】:2013-04-13 20:18:48
【问题描述】:

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

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

每个物品都有一个玩家的名字作为属性。 这些玩家的在线状态每 15 分钟变化一次,并且可以是真或假(显然)。

我希望能够只为在线玩家显示物品。

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

它是否也有助于在 ElasticSearch 中为玩家编制索引?是否可以用另一个索引做某种JOIN

edit:在深入研究了如何使用 ES 进行连接之后,我发现如果我在 ES 中索引玩家,实际上可以使用 has_child。 Tire 没有has_child 的方法,但是用现有的 DSL 可以吗?

【问题讨论】:

    标签: search join elasticsearch tire


    【解决方案1】:

    似乎很适合玩家和物品之间的父子关系,即使您不需要在父文档上进行全文搜索,因为:

    1. 每个物品都属于一个玩家
    2. 它们具有独立的更新生命周期:当玩家更改时,您不希望重新索引他的所有项目
    3. 您只想返回孩子,对他们的父母应用过滤器。

    您也可以在与项目相同的索引中,但在单独的类型中为您的玩家编制索引。您需要在映射中声明玩家类型为物品类型的parent

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

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

    然后您可以对项目执行全文搜索,使用以下has_parent filter 过滤它们。

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

    这样你只会查询并最终返回属于活跃玩家的物品。

    为了更新播放器,您可以使用update API 并可能使用脚本来避免重新发送整个文档。请注意,无论如何,文档都会被删除并重新索引,这就是 lucene 的工作原理。

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

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

    【讨论】:

    • 太棒了,谢谢。我实际上开始阅读有关 has_child/has_parent 的内容。我将在不同的索引中索引玩家,因为我已经为每种类型的项目建立了索引。现在我需要找出如何用轮胎做到这一点。非常感谢这个很棒的答案。
    • 不幸的是,不同的索引不支持父子节点。它们必须是同一索引中的不同类型。子文档将在与其父文档相同的分片中被索引,因为这是它实际工作的唯一方式。
    • By limiting itself to parent/child type relationships elasticsearch makes life easier for itself: a child is always indexed in the same shard as its parent, so has_child doesn’t have to do awkward cross shard operations. 确实。这很可悲......我想我唯一的选择是在一个索引中重新索引所有内容:(
    • 是的,不幸的是你已经达到了它的局限性,我认为这对你来说不是一个大问题,但可以肯定的是,这很烦人。
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多