Узкая стог сена Джанго с оператором ИЛИ между полями

Я делаю поиск. Я сужу по полю А. Я сужаю по полю Б. Я получаю результаты, которые включают мешковину и мешок. Я хочу получить результаты, которые включают мешковину или мешок.

sqs = sqs.narrow(fieldA='burlap')
sqs = sqs.narrow(fieldB='sack')

Вы можете сделать некоторый уровень ИЛИ сужения с помощью следующего:

sqs = sqs.narrow(fieldA=('burlap' or 'tweed' or 'plastic'))
sqs = sqs.narrow(fieldB='sack')

Но вы все равно получите результаты с мешковиной и мешком. Альтернативой этому методу является следующее, но он не идеален, так как он кажется медленным на больших наборах данных:

sqs = sqs.filter_or(fieldA='burlap')
sqs = sqs.filter_or(fieldB='sack')

Где Даниэль Линдсей, когда он тебе нужен?

1 ответ

YMMV - документы ( http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html) указывают, что этот метод не переносим между бэкэндами и что синтаксис зависит от бэкенда. В примере из этого раздела даже есть пример "SearchQuerySet(). Thin ('title:smoothie')", выполненный в стиле lucene.

В источнике похоже, что стог сена довольно доверчиво передает все, что у вас есть, в качестве узкого аргумента в бэкэнд. Вы не сказали, какой бэкэнд вы используете, но, может быть, что-то вроде этого даст вам то, что вы хотите в solr:

    sqs = sqs.narrow('fieldA:burlap OR fieldB:sack')

Filter_or - это другое животное, нежели узкое, по крайней мере с solr. Filter_or добавит это предложение к основному запросу, что приведет к другому набору результатов, разным оценкам и т. Д. Узкий будет создавать запрос фильтра. Вместо этого он используется для фильтрации ваших исходных результатов (шокирующий, верно?) И может быть кэширован, что может повысить производительность, если вы собираетесь многократно использовать этот фильтр.

Я напечатал все эти вещи и до сих пор не знаю, где Даниэль Линдсей.

Другие вопросы по тегам