2013-04-20 79 views
2

沒有索引外部數據進行過濾,我不能找到一種方法,做與ElasticSearch如下:如何在ElasticSearch

  • 我已經200萬項ElasticSearch
  • 索引我有30000級的玩家保存在MySQL

每個項目都有一個玩家的名字作爲屬性。 這些球員的在線狀態每15分鐘更改一次,可以是真或假(顯然)。

我想只能顯示在線玩家的物品。

我不認爲我可以將項目的在線狀態編入索引,因爲它經常變化。 我無法真正獲得在線玩家的所有ID,並將其用作過濾器,因爲有這麼多。

它有助於在ElasticSearch中對玩家進行索引嗎?是否有可能與另一個索引做某種JOIN

編輯:在詳細瞭解如何與ES加入後,我發現如果我在ES中爲玩家編制索引,它實際上可以用has_child。輪胎沒有has_child的方法,但是可以用現有的DSL來完成嗎?

回答

2

似乎是一個非常適合的球員和項目之間的父子關係,即使你並不需要在父文件全文檢索,這是因爲:

給玩家
  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的連接表。

+0

太棒了,謝謝。我實際上開始閱讀has_child/has_parent。我會用不同的索引來索引玩家,因爲我已經有了每種類型物品的索引。現在我需要找出如何與蒂爾做到這一點。非常感謝這個偉大的答案。 – Robin 2013-04-20 16:52:31

+0

不幸的是,父子不支持跨不同的索引。它們在同一索引內必須是不同的類型。孩子們將被歸入與母文檔相同的分片,因爲這是實際工作的唯一方式。 – javanna 2013-04-20 17:06:16

+0

'通過將自身限制爲父/子類型關係,elasticsearch使自己的生活變得更加簡單:小孩始終與其父母相同的分片索引,因此has_child不必執行尷尬的交叉分片操作。這很難過......我猜想我唯一的選擇是重新索引一個索引中的所有內容:( – Robin 2013-04-20 17:16:07