Solr: как отметить совпадение условий запроса в результате

В моей реализации solr есть запрос, подобный этому

q=(поле1: iPod и поле2: черный) ИЛИ (поле3: «компьютеры Apple») ИЛИ (поле4: работает)

Здесь по существу 3 условия, разделенные «ИЛИ». Когда я запускаю этот запрос, я получаю результаты. В результатах я хотел бы увидеть, какое из трех условий было выполнено. Например, в результатах в дополнение к возвращаемым данным (настраиваемым полям), в частности, я хотел бы иметь cond1=true, cond2=true, cond3=false для каждого возвращаемого документа.

Предположим, что в этих полях (от 1 до 4) не будет выполняться анализ. Все поля строковые. Солер 4.6.1. Распространяется.

Пробованные решения (но без удовлетворительных результатов):

  1. debugquery=true, кажется, дает слишком много подробной информации (поле объяснения), которая меня не интересует, я ищу простые поля для добавления. я могу получить эти отладочные XML-файлы для синтаксического анализа, но они сложны для обычной обработки.
  2. Параметр group by (group.query) поможет, предоставив условия в group.query, чтобы мы сгруппировали это по условиям, не лучший вариант для меня, но я только что попробовал. Но похоже не работает в распределенном режиме (SOLR-5046)
  3. Добавление запроса функции поля, невозможно выполнить простую проверку равенства поля для строки, например _cond1_:if(field1=='ipod' и field2=='black'). Думаю, в функциональном запросе такая проверка на равенство невозможна.

Любые другие варианты решений здесь? Должен ли я написать здесь собственное сходство или собственный преобразователь документов?


person Ganesh    schedule 27.10.2014    source источник


Ответы (1)


Принимая подсказку от https://cwiki.apache.org/confluence/display/solr/Function+Queries

вы можете использовать следующий параметр fl в своем запросе:

fl=*,firstmatch:if(and(termfreq(field1,'ipod'),termfreq(field2,'black')),1,0),
secondmatch:if(termfreq(field3,'apple computer')),1,0),
thirdmatch:if(termfreq(field4,'working'),1,0)

(новые строки только для ясности)

Это должно дать вам три поля с 1 или 0 для совпадений.

Основная идея заключается в том, что вы можете использовать функциональные запросы в поле fl для получения конкретных значений. Имена firstmatch, secondmatch и thirdmatch — это просто псевдонимы.

Кстати, поскольку вы упомянули, что все ваши поля являются строками, вам везде понадобятся точные совпадения.

person arun    schedule 28.10.2014
comment
Знаете ли вы, как использовать подстановочные знаки в termfreq fq? так что вы могли бы использовать termfreq(text, manage*) для сопоставления Manager, Manage и Management? - person A.O.; 07.02.2015