Lucene.NET - поиск документов, не содержащих указанного поля.

Скажем, у меня есть 2 экземпляра класса под названием «Животное».

У животного есть 3 поля: имя, возраст и тип.

Поле имени допускает значение NULL, поэтому перед тем, как вставить экземпляр Animal в качестве индексированного документа Lucene, я проверяю, установлено ли Animal.Name == null, и если это так, я не вставляю его в качестве поля в свой документ. Если бы мне пришлось получить всех животных, я бы увидел, что поле «Имя» не существует, и я могу установить для него значение null.

Однако могут возникнуть ситуации, когда я хочу сказать: «Принесите мне всех животных, имена которых еще не указаны». В этой ситуации я хочу получить все документы Lucene.NET из моего индекса животных, которые не содержат поле «Имя».

Есть ли простой способ сделать это с помощью Lucene.NET? Я хочу держаться подальше от необходимости выполнять какие-то взломы, чтобы проверить, имеет ли поле моего имени значение 'null'.


person Brandon    schedule 28.04.2010    source источник


Ответы (1)


Я считаю, что вы можете сделать это с помощью Solr, но не напрямую с Lucene, поэтому это невозможно с Lucene.Net.

Вот два неплохих обходных пути:

  1. Для элементов со значением NULL в поле добавьте настраиваемую строку, например __NULL__ или аналогичную, вместо того, чтобы опускать поле. Это будет доступно для поиска.
  2. Для элементов со значением NULL в поле добавьте поле, которое не будет присутствовать в элементах со значением. Например. EMPTY_FIELD = "no". Это можно использовать в фильтре.

Надеюсь, это поможет вам немного в пути.

person Mikael Svenson    schedule 28.04.2010
comment
Ваше решение просто выполнить взлом с зарезервированным ключевым словом будет работать. Теперь мне просто нужно выяснить, почему специальные символы не обрабатываются должным образом при выполнении поиска. Я создал еще один пост, чтобы узнать, почему у меня такое странное поведение со специальными символами. stackoverflow.com/questions/2732987/ - person Brandon; 29.04.2010