Отрицание в solr-запросе

Я пытаюсь выполнить следующий запрос и получаю только нулевые результаты (согласно моему набору данных я должен получить 10 результатов)

http://mymachine:8983/solr/select/?q=-(HOSTID:302)

Я также попробовал следующий запрос и снова получил нулевые результаты.

http://mymachine:8983/solr/select/?q=NOT(HOSTID:302)

Однако я получаю 10 результатов (ожидаемых), когда помещаю запрос таким образом,

http://mymachine:8983/solr/select/?q=-(HOSTID:302)AND(*:*)

Почему происходит эта странная вещь? Это ошибка в solr или я что-то упустил?


person Greenhorn    schedule 18.05.2012    source источник
comment
Имеет смысл потребовать что-то, из чего можно вычесть отрицательный член. Solr, вероятно, не реализует отрицательный поиск индекса, а вместо этого фильтрует уже существующий набор и, вероятно, не будет реализовывать *:* по умолчанию, если не указано ничего другого. Производительность такого запроса может быть не очень хорошей.   -  person Potatoswatter    schedule 18.05.2012
comment
@Potatoswatter Я понимаю, что это ограничение производительности, и поэтому я ищу правильный путь. В основном я ищу что-то, что дало бы мне MySQL-эквивалент Select * from table where hostid != 302   -  person Greenhorn    schedule 18.05.2012
comment
Если hostid, вероятно, будет 302 для большей части записей, вам, вероятно, потребуется настроить схему, чтобы включить поле, указывающее, что это не 302, для лучшей производительности. Вы можете использовать поле с подстановочными знаками для проверки концепции без особого влияния. Но я все еще новичок в Solr, поэтому больше не буду пытаться ответить на этот вопрос; v)   -  person Potatoswatter    schedule 18.05.2012
comment
+1 за комментарии @Potatoswatter - насколько я понимаю, отрицательный запрос предназначен для фильтрации, в отличие от оператора SQL NOT. Lucene/Solr оптимизирован для поиска, а не для запросов к базе данных :)   -  person Ansari    schedule 18.05.2012


Ответы (1)


Ахмет Арслан из списка рассылки solr помог мне с решением. Просто упоминание об этом здесь для будущих преимуществ.

Solr преобразует отрицательный запрос верхнего уровня (-field:something) в q=+: -field:something

Кажется, вам не хватает этой части.

org.apache.solr.search.QueryUtils

`/** Fixes a negative query by adding a MatchAllDocs query clause.
  * The query passed in *must* be a negative query.
  */
 public static Query fixNegativeQuery(Query q) {
   BooleanQuery newBq = (BooleanQuery)q.clone();
   newBq.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
   return newBq;
 }`
person Greenhorn    schedule 12.06.2012