Как написать запрос Solr для извлечения всех записей с числовым значением поля меньше указанного? - PullRequest
12 голосов
/ 30 декабря 2011

Предположим, у нас есть набор mp3-плееров с именами и ценами.

Как написать правильный запрос solr для поиска всех товаров с определенным именем и стоимостью менее 100 $?

q = "(name:(ipod) AND price ???? 100.0)"

Ответы [ 3 ]

18 голосов
/ 30 декабря 2011

Я не думаю, что анализатор запросов поддерживает оператор <.Вы должны явно определить RangeQuery .Затем вы можете прикрепить запрос имени к этому, используя BooleanQuery .

Обновление: по-видимому, я ошибся.На самом деле, анализатор запросов Solr умнее, чем Lucene.Вот ваш ответ: http://wiki.apache.org/solr/SolrQuerySyntax#Differences_From_Lucene_Query_Parser

поле: [* TO 100] находит все значения поля, меньшие или равные 100

9 голосов
/ 02 января 2012

также обратите внимание, что для повышения производительности вы должны использовать фильтр запроса для этого:

&q=name:ipod&fq=price:[* TO 100]
7 голосов
/ 27 апреля 2017

Насколько я знаю, я не верю, что Solr / Lucene поддерживает больше / меньше чем.Это может быть сделано программно для таких вещей, как целые числа и даты (а в вашем случае - денежные значения, поскольку нужно беспокоиться только о двух десятичных разрядах).

Например, изначально парсеры запросов Lucene и Solr поддерживают меньшечем или равно (<=): </p>

?q=name:ipod AND price:[* to 99.99]

Это даст вам менее 100 долларов, которые вы ищете, если данные не содержат доли цента.

Для таких вещей, как даты и целые числа, или для других вещей, которые имеют заметные конечные различия, вы можете уменьшать (или в случае превышения, увеличивать) значение, к которому вы стремитесь.

РЕДАКТИРОВАТЬ: Проверьтедокументация для версии 6.5 Solr.Он содержит эксклюзивную поддержку диапазона.Страница 272 справочного руководства объясняет.

http://mirror.cc.columbia.edu/pub/software/apache/lucene/solr/ref-guide/apache-solr-ref-guide-6.5.pdf

По существу используйте фигурные скобки, чтобы обозначить меньше, чем.

?q=name:ipod AND price:{* TO 100}
...