Запрос Lucene.net для содержания и избегания пустых строковых полей

У меня есть настройка индекса Lucene, которую я могу запросить нормально. Я просто не могу заставить работать условие «поле не равно пустой строке». Например, в приведенном ниже примере кода я хочу иметь 3 условия.

  1. Где поле «тег страны» содержит «{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}».
  2. Где поле «тег страны» не является пустой строкой.
  3. Где диапазон «даты» находится между «20110101T000000» и «20121001T000000».

        WildcardQuery taggingQuery = new WildcardQuery(new Term("country tag", "*" + ShortID.Encode("{4ED2F7EE-5C2A-418C-B2F6-236F94166BA1}").ToLowerInvariant() + "*"));
        TermQuery taggingNotQuery = new Term("country tag", " "));
    
        RangeQuery rangeQuery = new RangeQuery(new Term("date", "20110101T000000"), new Term("date", "20121001T000000"), true);
    
        BooleanQuery booleanQuery = new BooleanQuery();
        booleanQuery.Add(taggingQuery, BooleanClause.Occur.MUST);
        booleanQuery.Add(taggingNotQuery, BooleanClause.Occur.MUST_NOT);
        booleanQuery.Add(rangeQuery, BooleanClause.Occur.MUST);
    

У меня такое чувство, что я делаю это неправильно или мой запрос как-то неверен. Мне не нужно условие, при котором я должен искать пустые или пустые поля.

Любая помощь приветствуется!


person Gabbar    schedule 07.11.2012    source источник
comment
Можете ли вы показать код, который вы используете для записи документа в индекс, в котором нет страны?   -  person Prescott    schedule 07.11.2012
comment
Добавляете ли вы поле тега страны несколько раз в документ? Если нет, то вам не нужно предложение MUST_NOT. Кстати, ваш MUST_NOT проверяет наличие пробела, а не пустую строку. Наконец, из того, что вы говорите, я бы рекомендовал вам не добавлять поля с пустой строкой, просто не добавляйте поле в свой документ.   -  person Jf Beaulac    schedule 08.11.2012


Ответы (2)


Если вы разрешите '*' в качестве первого символа в строке поиска, Lucene может использовать такие запросы, как "countrytag:*", чтобы найти все документы, содержащие что-либо в поле countrytag. (По умолчанию Lucene отключает начальный символ «*» в строке запроса.)

person Mark Leighton Fisher    schedule 07.11.2012
comment
Я попытался использовать запрос WildQuery = new WildQuery (тег страны, [GUID]); но это не сработало. Этот запрос добавляется к логическому запросу вместе с другими запросами диапазонов и терминов. Кроме того, я попытался QueryParser разрешить ведущую звезду, но это тоже не сработало. Поле тега страны анализируется StandardAnalyzer и представляет собой строку значений GUID. После анализа он добавляется как ASDF342SDFAS 2342LJLJl с пробелами между ними. Имейте в виду, что GUID — это просто примеры. Фактические значения — это настоящие идентификаторы GUID без дефисов и фигурных скобок. Я просто не могу заставить эту штуку работать, и прямо сейчас у меня кончается разум. - person Gabbar; 08.11.2012
comment
Кроме того, значение, которое я пытаюсь найти, преобразуется в формат анализируемого поля, например, 23LKLL233. - person Gabbar; 08.11.2012

Я должен был уделить больше внимания при настройке индекса. Я забыл добавить анализаторы полей для каждого поля. Поля мультисписка индексировались другим анализатором вместо стандартного. Я добавил это в свой раздел конфигурации для сканирования полей, и мой запрос начал работать

<fieldTypes hint="raw:AddFieldTypes">
                  <!-- Text fields need to be tokenized -->
                  <fieldType name="single-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="multi-line text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Multilist based fields need to be tokenized to support search of multiple values -->
                  <fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                  <!-- Legacy tree list field from ver. 5.3 -->
                  <fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
                </fieldTypes>
person Gabbar    schedule 08.11.2012