TermQuery не возвращается по известному поисковому запросу, но WildcardQuery делает - PullRequest
7 голосов
/ 24 февраля 2012

Я надеюсь, что кто-то, обладающий достаточным пониманием внутренней работы Lucene, сможет указать мне правильное направление =)

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

document.Add( new Field("Typenummer", "E5CEB501A244410EB1FFC4761F79E7B7", 
                        Field.Store.YES , Field.Index.UN_TOKENIZED));

Позже, когда я ищу свой индекс (используя другие типы запросов), я могу убедиться, что это поле действительно появляется в моем индексе - как при циклическом просмотре всех полей, возвращаемых Document.GetFields ()

Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7

Пока все хорошо: -)

Теперь настоящая проблема заключается в том, почему я не могу использовать TermQuery для поиска по этому значению и фактически получить результат.

Этот код производит 0 хитов:

// Returns 0 hits
bq.Add( new TermQuery( new Term( "Typenummer", 
        "E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

Но если я переключу это на WildcardQuery (без подстановочных знаков), я получу 1 ожидаемый удар.

// returns the 1 hit I expect
bq.Add( new WildcardQuery( new Term( "Typenummer", 
        "E5CEB501A244410EB1FFC4761F79E7B7" ) ), BooleanClause.Occur.MUST );

Я проверил длины полей, я проверил, что я использую тот же Анализатор и т. Д., И я все еще нахожусь в квадрате 1 относительно того, почему это так.

Кто-нибудь может указать мне направление, в котором я должен искать?

1 Ответ

8 голосов
/ 01 марта 2012

Я наконец понял, что происходит. Я расширяю теги для этого вопроса, поскольку, к моему большому удивлению, на самом деле это была проблема с CMS, в которой существует эта конкретная проблема. Таким образом, проблема сводилась к следующему:

  1. Поле хранится UN_TOKENIZED, что означает, что Lucene будет хранить его точно «как есть»
  2. BooleanQuery, из которого я вставил фрагменты, отправляется в Sitecore SearchManager в оболочке PreparedQuery
  3. Поведение, которое я ожидал от этого, состояло в том, что мой запрос (уже подготовленный) будет идти - без изменений - к Lucene API
  4. Оказывается, я был неправ. Он проходит через метод RewriteQuery, который копирует весь мой набор вложенных запросов как есть, за одним исключением - все аргументы Term передаются через LowercaseStrategy ()
  5. Когда я проиндексировал термин UPPERCASE (UN_TOKENIZED), а Sitecore меняет мой PreparedQuery на строчные - возвращается 0 результатов

Я не собираюсь начинать спор о том, является ли это "разработкой" или "разработкой" реализации API Lucene Wrapper - я просто отмечу, что переписать мой запрос при использовании перегрузки PreparedQuery ... я ... неожиданный; -)

Дальнейшие учения из этого; Сохранение поля как TOKENIZED также устранит эту проблему, так как StandardAnalyzer по умолчанию будет использовать все токены в нижнем регистре.

...