2015-11-03 34 views
0

我有一個包含apache日誌數據的elasticsearch索引。這是我想要做的:在Elasticsearch中創建我的數據子集的最佳方式是什麼?

  1. 確定訪問某個文件(例如/signup.php)的所有訪問者(通過ip號碼)。
  2. 請在我的數據的搜索/查詢/匯聚,但限制進行考察,以包含IP號的第1步中

發現在SQL世界的文件,我只是想創建一個臨時表並從第一步插入所有匹配的IP號碼。接下來,我會查詢我的主表並通過加入我的臨時表中的IP號碼來限制結果集。

我明白在elasticsearch中連接是不可能的。該elasticsearch documentation提出一些方法來處理這樣的情況:

  1. 應用方面加入

這似乎並不現實,因爲IP號碼列表可能會非常大,它似乎效率不高送結果傳遞給客戶端,然後在一個巨大的條件過濾器中將其傳回給elasticsearch。

  • 非規範化的數據
  • 這將涉及遍歷匹配的IP號碼和在用於與類似「in_group」任何給定的IP號碼的索引更新的每個文檔:真的,所以我可以在以後的查詢中使用它。這似乎也是非常不切實際和低效的,特別是因爲源查詢(步驟1)是動態的。

  • 嵌套的對象和/或父 - 子關係
  • 我不知道如果與嵌套對象動態創建新文檔是在這種情況下實際的。在我看來,我最終會複製大量的數據。

    我是elasticsearch和noSQL的新手,所以也許我只是以錯誤的方式來看問題,我不應該試圖首先模擬一個JOIN。

    但是這似乎是分割數據集的一種常見情況,這讓我想知道我是否忽略了其他一些明顯的做法?

    任何幫助,將不勝感激!

    +0

    我不認爲它應該成爲答案,但是,是的,只要我能理解你的問題,你就必須使用應用端連接。對Elastic來說不應該太重(尤其是如果你使用過濾器,而不是查詢來獲取IP) –

    回答

    0

    如果我正確理解你的問題,你正試圖根據一定的條件得到你的文檔的一個子集,並使用該子集進一步查詢/搜索/聚合它。

    如果爲true,您爲什麼要將它存儲在另一個視圖(sql類型)中。 elasticsearch的主要功能是它的過濾器緩存功能,因此它大大減少了查詢時間。使用此功能,您需要執行的所有查詢/搜索/聚合需要一個術語過濾器,用於指定您在步驟1中要執行的條件。現在,無論您想要執行的其他操作如何,您都可以執行此操作在已經收縮的數據集中的相同查詢中。

    如果您有其他不同的使用情況,則可以考慮更改文檔(映射)的存儲以便於更快速地檢索。

    +0

    是的,你理解正確。如果我使用條件過濾器並傳入一長串數字,我可以在一個查詢中完成所有操作。但是,如何在不拉動線路上的所有數據的情況下製作IP數組?從@ evaldas-buinauskas的評論和他的鏈接問題看來,elasticsearch正在研究它,但是如果您有任何建議,那將會很棒 – Michael

    +0

    我已經得到了您的確切要求,而evaldas實際上提到的是合乎邏輯的。我的回答是基於這樣的假設,即如果IP和所訪問的文件在單個文檔中可用,並且所有其他操作也需要在同一組文檔中發生,則詞條過濾器可以幫助您至少進行一些查詢。 – piyushGoyal

    相關問題