2013-08-17 4 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"}, 

поиска документов, содержащих "Hello" в названии, что истек/Перед 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», но она будет содержать поле «версий», которое поддерживает упорядоченный список с полем «version_num». Я думаю, вы могли бы использовать какой-то скрипт, чтобы получить только последний элемент на этом этапе ... может быть? –

+0

Я не думаю, что то, что вы просите, напрямую возможно. Кроме того, @James, es может не только возвращать «соответствующие» части вложенного документа, весь документ возвращается, если он является хитом. – ramseykhalaf

+0

Извините @JamesAddison Я неправильно прочитал ваш комментарий (под-объекты превратились в вложенные документы). Да, я думаю, это сработает. В противном случае вы можете иметь логический «последний» флаг и фильтровать его. Решение заключается в том, следует ли выполнять дополнительную работу в индексном времени или во время поиска. – ramseykhalaf

ответ

1

То, что вы хотите, называется разваливанием поля, и это одна из немногих функций, которые Apache Solr имеет, а ElasticSearch - нет.

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

Там очень много запросов на эту функцию в ElasticSearch, но это еще не реализовано.