2013-06-11 2 views
8

У меня есть список элементов, как:как фильтровать поиск по значениям, которые не доступны

i = SearchQuerySet().models(Item) 

теперь каждый элемент i имеет атрибут, price

Я хочу, чтобы сузить результат цена которой информация не доступна вместе с теми, падая в заданном диапазоне

что-то вроде

i.narrow('price:(None OR [300 TO 400 ])') 

как это можно сделать?

+2

Может показаться, что [этот синтаксис] (http://stackoverflow.com/questions/4238609/how-to-query-solr-for-empty-fields) может работать? –

+0

@MartijnPieters этот синтаксис работал отдельно, но не вместе с OR. Я обновил свой вопрос –

ответ

6

Попробуйте это:

-(-price:[300 TO 400] AND price:[* TO *]) 

логически то же самое, и он работает в Solr.

+0

почему ~ AND' не 'OR', хотя он работает как для' AND', так и для OR ', мне интересно, почему –

+0

Я не думаю, что это работает с OR. посмотрите на эту ссылку: http://whatis.techtarget.com/definition/logic-gate-AND-OR-XOR-NOT-NAND-NOR-and-XNOR. Если вы забудете секунду отрицательный внутри родительского поля, что мы действительно делаем здесь в NAND между двумя терминами, и это может быть очень похоже на OR, но не во всех случаях, будьте осторожны. –

5

В соответствии с SolrQuerySyntax

Pure Негативные запросов: -

-field:[* TO *] finds all documents without a value for field

Вы можете попробовать: - q=(*:* -price:[* TO *]) OR price:[300 TO 400]

+0

, он все еще не дает мне предметов с ценами от 300 до 400 –

+0

Какой тип поля цены? sint? или строка/текст? – Jayendra

+0

ценовое поле decimal (float) –

-1

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

?q=*:*&fq=((-price:[* TO *]) or (price:[300 TO 400])) 
+0

Cojucaru, Можете ли вы дать запрос в 'models (Item) .filter' .. form. Я действительно новичок в solr и не могу преобразовать ваш код в эту форму. –

+0

попробуйте что-то вроде этих моделей (Item) .filter_or (price = None, price__range = [300, 400]) на основе https://github.com/soby/django-haystack/commit/71c0b0bdf4e7a25421139901c910a978bb1c5386 для Пустые значения нужно использовать Нет –

+0

Дает ошибку 'Invalid Number: or' with Solr 6.6 –

0

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

  1. Автомобили
  2. Лодки
  3. Велосипеды с изображением
  4. Велосипеды без изображения

Это был мой первый подход запроса: type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5 (работает отлично)

Но я забыл старые элементы данных без поля типа. Должен быть в наборе результатов, как это:

  1. Автомобили
  2. Лодки
  3. Велосипеды с изображением
  4. Велосипеды без изображения
  5. Все детали без типа

Так я изменил свой запрос на -type:[* TO *] OR type:"car"^10000 OR type:"boat"^5000 OR (type:"bike" AND image-type:[* TO *])^100 OR type:"bike"^5 и не получил результатов.

Так я нашел эту тему и попытался изменить свой запрос -(type:[* TO *] OR -type:"car"^10000 OR -type:"boat"^5000 OR -(type:"bike" AND image-type:[* TO *])^100 OR -type:"bike"^5), как показано в этом ответе https://stackoverflow.com/a/17211744/326905

Но, к сожалению, все элементы имеют один и тот же счет :(

0

Двойной инвертированный запрос, предложенный Маурицио может ошибка причина:

unexpected docvalues type NUMERIC for field 'price' (expected one of [SORTED, SORTED_SET]). Re-index with correct docvalues type. 

(даже после повторной индексации Это может иметь что-то делать с index и store и docvalues. Параметры поля)

Что вы могли бы сделать вместо освобожден оба диапазона (до и после) значений вы действительно заинтересованы в:.

-(price:[* TO 300} price:{400 TO *]) 

отметить, что значения 300 и 400 исключается при использовании фигурные скобки в этом отрицательном запросе и, таким образом, включены в результаты поиска.

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