2016-12-15 242 views
1

我需要爲用戶和文章建模網站,其中每個用戶可以用任何文章多次交互(讀取,打開e.t.c)。我想通過以下嵌套映射到一個elasticsearch指數這個數據模型:索引文件的通過嵌套字段值聚合彈性搜索索引

{ 
    "mappings": { 
     "user": { 
      "properties": { 
       "user_id": {"type": "string"}, 
       "interactions": { 
        "type": "nested", 
        "properties": { 
         "article_id": {"type": "string"}, 
         "interact_date": {"type": "date"} 
        } 
       } 
      } 
     } 
    } 
} 

例如:

{ 
    "user_id": 20, 
    "interactions": [ 
     {"article_id": "111", "interact_date": "2015-01-01"}, 
     {"article_id": "111", "interact_date": "2015-01-02"}, 
     {"article_id": "222", "interact_date": "2015-01-01"} 
    ] 
} 

我需要做的數據可以聚合:

  1. 每天的互動總數,通過嵌套聚合完成:

    GET /_search 
    { 
        "size": 0, 
        "aggs": { 
         "by_date": { 
          "nested": { 
           "path": "interactions" 
          }, 
          "aggs": { 
           "m_date": {"terms": {"field": "interactions.interact_date"}} 
          } 
         } 
        } 
    } 
    
  2. 每天唯一用戶交互次數。如果特定用戶與同一日期範圍內的多篇文章進行交互,則用戶應只計算一次。 Postgres裏很簡單的查詢: 與3列的表[USER_ID,article_id的,interact_date]

    SELECT dt, count(uid) 
    FROM (SELECT interact_date::TIMESTAMP::DATE dt, user_id uid FROM interactions 
         GROUP BY interact_date::TIMESTAMP::DATE, user_id) by_date 
    GROUP BY dt; 
    

    我如何可以做同樣的elasticsearch指數?

  3. 如何通過_update添加交互而不重新索引整個文檔?

  4. 如何按特定文章過濾用戶 - 僅在與某個指定文章互動時按聚合日期統計用戶一次?

謝謝

回答

1

每天獨立用戶數互動。

{ 
    "size": 0, 
    "aggs": { 
    "nested_agg": { 
     "nested": { 
     "path": "interactions" 
     }, 
     "aggs": { 
     "per_day": { 
      "date_histogram": { 
      "field": "interactions.interact_date", 
      "interval": "day", 
      "min_doc_count": 1 
      }, 
      "aggs": { 
      "users_count": { 
       "reverse_nested": {}, 
       "aggs": { 
       "uniques": { 
        "cardinality": { 
        "field": "user_id" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

如何通過添加互動_Update無需重新索引整個文件?

這是不可能的。這是definition of a nested object要更新,添加或刪除嵌套對象,我們必須重新索引整個文檔。

如何按特定文章過濾用戶 - 僅在與某一指定文章進行交互時按聚合日期統計用戶一次?

{ 
    "size": 0, 
    "query": { 
    "nested": { 
     "path": "interactions", 
     "query": { 
     "term": { 
      "interactions.article_id": { 
      "value": "222" 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "nested_agg": { 
     "nested": { 
     "path": "interactions" 
     }, 
     "aggs": { 
     "filtered": { 
      "filter": { 
      "term": { 
       "interactions.article_id": { 
       "value": "222" 
       } 
      } 
      }, 
      "aggs": { 
      "per_day": { 
       "date_histogram": { 
       "field": "interactions.interact_date", 
       "interval": "day", 
       "min_doc_count": 1 
       }, 
       "aggs": { 
       "users_count": { 
        "reverse_nested": {}, 
        "aggs": { 
        "uniques": { 
         "cardinality": { 
         "field": "user_id" 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

謝謝@AndreiStefan。關於重新索引,我的意思是如果可以通過「安全」更新操作添加新的交互,只添加它的迭代仍然不存在。取而代之的是獲取文檔,在客戶端進行更新並放回原處。我有很多線程爲同一用戶更新交互,並希望在沒有分佈式鎖的情況下更新文檔。 – Hersh

+0

使用版本(https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html)進行更新。 –