2013-07-30 15 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 
     } ] 
    } 
    } 
}