2012-02-24 2 views
7

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

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

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

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

Field: Typenummer, Value: E5CEB501A244410EB1FFC4761F79E7B7 

до сих пор так хорошо :-)

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

Этот код производит 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, почему это.

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

+2

Я не очень хорошо знаком с Lucene.net, но если он использует ту же структуру индекса, что и версия java, вы можете использовать Luke http://code.google.com/p/luke/, чтобы проверить, что ваш индекс структура соответствует вашим ожиданиям.В качестве альтернативы, вы могли бы проверить, позволяет ли TermIndex # seekExact найти ваш термин? – jpountz

ответ

8

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

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

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

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

+0

Очень хорошо знать –

+0

Просто столкнулся с аналогичной проблемой с Lucene.NET. Это сообщение спасло меня от потери времени. – RationalGeek

+0

@mark Cassidy Wow. Единственный, кто обсуждает эту проблему. У меня такая же проблема. Я пытаюсь отфильтровать значение перед передачей его в Search. Фильтр фильтра = новый QueryWrapperFilter (новый WildcardQuery (новый термин (поле1, «005NWVOXDYN3U0V6»))). Текстовые значения не работают в этом фильтре. Однако цифры работают. Я даже пробовал TermQuery, но тот же результат. Можете ли вы помочь мне с этой проблемой, пожалуйста? – Huzaifa

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