2011-11-09 3 views
4

Например, если у меня есть эти 2 Документы:Solr, многозначное поле: как я могу вернуть документы, где ВСЕ значения в поле содержатся внутри набора?

id: 1 
multifield: 2, 5 

id: 2 
multifield: 2, 5, 9 

Тогда говорят, у меня есть набор, что я запросов с, что {2, 5, 7}. Я бы хотел, чтобы возвращался документ 1, потому что 2 и 5 содержатся в наборе. Но документ 2 не должен возвращаться, потому что 9 не входит в набор.

И многозначное поле, и мое множество имеют произвольную длину. Надеюсь, это имеет смысл.

ответ

6

Понял это. This было вдохновением, в частности, ответом, предлагающим использовать Function Queries.

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

id: 1 
multifield: 2, 5 
nummultifield: 2 

id: 2 
multifield: 2, 5, 9 
nummultifield: 3 

Тогда я буду использовать frange с некоторыми функциональными запросами. Для каждого элемента в моем наборе я буду использовать функцию termfreq, которая вернет 1 или 0. Затем я суммирую все эти значения. Наконец, если эта сумма равна расчетному полю nummultifield, то я знаю, что для этого документа каждое значение в документе присутствует в наборе. Помните мой набор является 2,5,7 поэтому моя функция запроса будет выглядеть следующим образом:

fq={!frange l=0 u=0}sub(nummultifield, sum(termfreq(multifield,2), termfreq(multifield,5), termfreq(multifield,7))) 

Если мы заполняем значения для документа 1 и 2, будет выглядеть следующим образом:

Document 1: sub(2, sum(1,1,0)) = 0 ' in my range of {0,0} so Doc 1 is returned 
Document 2: sub(3, sum(1,1,0)) = 1 ' not in the range of {0,0} so not returned 

Я проверил его, и он отлично работает. Вам нужно убедиться, что вы не дублируете какие-либо значения в multifield или получите странные результаты. Кстати, этот трюк использования frange можно использовать всякий раз, когда вы хотите подделать логический результат из одного или нескольких функциональных запросов.

+0

Как вы получили динамическое поле, чтобы вернуть число значений в многозначном поле? – iwayneo

+0

Не динамическое поле, оно поддерживается вручную. Уродливый, но эффективный – brian519

+0

Это то, с чем я закончил. Это хорошо работает, так что все хорошо :) – iwayneo

0

Ограждение может быть тем, что вы ищете.

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

http://www.lucidimagination.com/devzone/technical-articles/faceted-search-solr

how to search for more than one facet in solr?


Я приспособил это по ссылке Lucid Imagination.

Выберите все документы, которые имеют значения 2 или 5 или 7:

http://localhost:8983/solr/select?q=* 
    &facet=on 
    &facet.field=multifield 
    &fq=multifield:2 
    &fq=multifield:5 
    &fq=multifield:7 

Неполная: Я не знаю, какие варианты в исключить все другие значения.

+0

Я не думаю, что это работает. fq = multifield: 7 приведет к фильтрации документа 1, так как все fq имеют значение AND'd – brian519

+0

Вы попробовали? Я некоторое время от своего офисного ПК, но я уверен, что это означает ** set union **, "вернуть все строки, чей * multifield * принимает значения либо * 2 * или * 5 *, либо * 7 *", что операция ИЛИ. Поправьте меня, если я ошибаюсь. – aitchnyu

+0

Я очень уверен, что fq - все AND'd вместе. См. Это для запроса функции (не стесняйтесь проголосовать за это!) Я отправил Solr, чтобы дать больше вариантов: https://issues.apache.org/jira/browse/SOLR-1223?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13148341#comment- 13148341 – brian519

Смежные вопросы