2013-08-17 96 views
1

我有記錄,版本,標題和過期字段的數據。 記錄是一個非唯一的字段,每個記錄可以有多個版本。通過多個屬性限制結果

在搜索結果中,我只需要顯示每個版本中的一個。

因此,有可能通過標題搜索某個日期之前/之前的文章,但僅返回每個版本的一個結果。

例如,給出這樣的數據:

{"record": 1, "version": 1, "title": "Hello", "expires": "2011-08-17 00:00:00"}, 
{"record": 1, "version": 2, "title": "Hello", "expires": "2012-08-17 00:00:00"}, 
{"record": 2, "version": 1, "title": "Hello world", "expires": "2010-08-17 00:00:00"}, 
{"record": 2, "version": 2, "title": "Hello world", "expires": "2011-08-17 00:00:00"}, 
{"record": 2, "version": 3, "title": "Hello world", "expires": "2012-08-17 00:00:00"}, 

搜索的稱號,那2012-08-18之前/到期含 「你好」 的文件,應返回:

{"record": 1, "version": 2, "title": "Hello", "expires": "2012-08-17 00:00:00"}, 
{"record": 2, "version": 3, "title": "Hello world", "expires": "2012-08-17 00:00:00"} 

(每條記錄的最新'版本')。

任何想法?

我必須迭代ES以外的結果嗎? 感謝您的閱讀!

+1

您是否已考慮將索引文檔中的版本化數據嵌套爲子對象?所以在你的索引中只會有一個'記錄1',但它將包含一個'versions'字段,它維護一個有'version_num'字段的有序列表。我想你可能可以使用某種腳本來檢索當時最新的項目......也許? –

+0

我不認爲你所問的是直接可能的。另外@James,es不僅可以返回嵌套文檔的'匹配'部分,如果它是一個命中,則整個文檔將被返回。 – ramseykhalaf

+0

對不起@JamesAddison我誤解了你的評論(子對象變成了嵌套文檔)。是的,我認爲這會奏效。否則,你可以有一個布爾「最新」的標誌和過濾器。決定是在索引時間還是在搜索時間完成額外的工作。 – ramseykhalaf

回答

1

你想要的就是所謂的字段摺疊,它是Apache Solr和ElasticSearch沒有的幾個特性之一。

http://wiki.apache.org/solr/FieldCollapsing

有很多關於在ElasticSearch此功能的請求,但它尚未實現。