2013-07-30 14 views
4

選擇不同的我的文檔的集合屬於少數作者:從elasticsearch

[ 
    { id: 1, author_id: 'mark', content: [...] }, 
    { id: 2, author_id: 'pierre', content: [...] }, 
    { id: 3, author_id: 'pierre', content: [...] }, 
    { id: 4, author_id: 'mark', content: [...] }, 
    { id: 5, author_id: 'william', content: [...] }, 
    ... 
] 

我想檢索和分頁基於作者的ID最匹配的文檔的不同選擇:

[ 
    { id: 1, author_id: 'mark', content: [...], _score: 100 }, 
    { id: 3, author_id: 'pierre', content: [...], _score: 90 }, 
    { id: 5, author_id: 'william', content: [...], _score: 80 }, 
    ... 
] 

這裏就是我目前做的(僞代碼):

unique_docs = res.results.to_a.uniq{ |doc| doc.author_id } 

問題正確分頁:如何選擇20個「獨特」文檔?

有些人指着term facets,但我並沒有真正做一個標籤雲:

感謝,
平硐

+0

什麼分數的結果嗎? – ramseykhalaf

+0

術語方面做得很好。你應該試試。 – shyos

+0

喜@shyos如果長期小面方面,他們告訴我,有一些獨特的文件,而不是1。他們怎麼得分和其他文件中 - 2.我不認爲它可以分頁(例如,顯示20個文件跳過第一個300。不同的結果) - 3.他們不允許突出顯示和所有其他好處 –

回答

4

截至目前ElasticSearch does not provide a group_by equivalent,這是我的手動嘗試。
儘管ES社區正在努力解決這個問題(可能是一個插件),但這是一個基本的嘗試,可以滿足我的需求。

假設。

  1. 我在尋找相關內容

  2. 我認爲第一個300個文檔是相關的,所以我認爲 限制我的研究這個選擇,無論多或它們的一些 來自同樣的幾位作者。

  3. 我的需求我沒有「真的」需要全分頁,它足夠 通過ajax更新了「顯示更多」按鈕。

缺點

  1. 結果是不準確的
    我們採取每次300個文件,我們不知道唯一的文檔將有多少出來(可能是可能是同一作者300個文檔!)。您應該瞭解它是否適​​合每位作者的平均文檔數量,並且可能會考慮限制。

  2. 你需要做2個查詢(等待遠程通話費用):

    • 第一個查詢請求只有這些領域300個相關的文檔:ID & AUTHOR_ID
    • 檢索分頁IDS的全面文檔第二個查詢

下面是一些紅寶石僞代碼:https://gist.github.com/saxxi/6495116

0

現在「GROUP_BY」的問題已被更新,可以使用從elastic 1.3.0 #6124此功能。

如果您搜索以下查詢,

{ 
    "aggs": { 
     "user_count": { 
      "terms": { 
       "field": "author_id", 
       "size": 0 
      } 
     } 
    } 
} 

,你會得到結果

{ 
    "took" : 123, 
    "timed_out" : false, 
    "_shards" : { ... }, 
    "hits" : { ... }, 
    "aggregations" : { 
    "user_count" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : "mark", 
     "doc_count" : 87350 
     }, { 
     "key" : "pierre", 
     "doc_count" : 41809 
     }, { 
     "key" : "william", 
     "doc_count" : 24476 
     } ] 
    } 
    } 
}