Поиск среди одного результата из каждой группы в Solr

У меня есть схема Solr с версионированием. Идентификаторы содержат номер версии, поэтому существующие документы сохраняются, а новые индексируются. Образец содержания:

id = foo1
name = foo
version = 1
data = x

id = foo2
name = foo
version = 2
data = y

id = bar1
name = bar
version = 1
data = x

Существует два различных сценария поиска: поиск во всех версиях или поиск только в последних. Первый тривиален, но как реализовать поиск в поле data только последних версий каждого name? В приведенном выше примере я хочу найти «x» в последнем и ожидаю, что попаду только «bar1».

Я надеялся найти решение с помощью http://wiki.apache.org/solr/FieldCollapsing, но если я ищу «x» с помощью group.field=name, Solr сгруппирует после поиска, дав мне версию 1 из двух названий выше. Мне нужно, чтобы он работал больше как запрос фильтра.


person solsson    schedule 18.09.2011    source источник
comment
Так вы говорите, что если вы ищете x, вы должны получить результат с id=foo2?   -  person Mike Sokolov    schedule 18.09.2011
comment
Нет, вы должны получить bar1, но не foo1.   -  person solsson    schedule 19.09.2011
comment
Нашел новую ветку списка рассылки с почти идентичным случаем: mail-archives.apache.org/mod_mbox/lucene-solr-user/201110.mbox/   -  person solsson    schedule 02.12.2011


Ответы (1)


Не думайте, что разрушение поля послужит вам для этой цели.

Я могу придумать пару вариантов -

  1. Создайте уникальный идентификатор для документа, чтобы при добавлении нового текущего документа старый был перезаписан, и у вас всегда была только одна версия документа.
  2. Если возможно, сохранить дополнительное поле для документов, в котором будет указано состояние ТЕКУЩЕЕ. Только последний документ будет иметь значение поля, и вам нужно будет сбросить значение для всех других версий документов. Таким образом, вы можете легко отфильтровать последние документы по запросу фильтра, а также выполнить поиск по всей версии с помощью запроса фильтра.
person Jayendra    schedule 18.09.2011
comment
# 1 сделал бы мой первый сценарий поиска невозможным. Что касается № 2, есть ли хороший способ пометить старый документ как НЕ ТЕКУЩИЙ при добавлении нового? Я думаю, что мне придется переиндексировать его. - person solsson; 19.09.2011
comment
Обработка # 2 должна выполняться из базы данных (или со стороны источника) и, безусловно, потребует повторной переиндексации всех версий документов. - person Jayendra; 19.09.2011
comment
В ПОРЯДКЕ. Это может быть план Б, в надежде на лучшие варианты. Альтернативой является индексирование сразу двух ядер, одно из которых перезаписывает (ваш вариант №1). Однако документы могут быть большими, поэтому я бы хотел, чтобы это была одна отправка. - person solsson; 19.09.2011