2010-01-17 3 views
4

Почему запрос подстановки «dog # V *» не может получить документ, содержащий «собаку # VVP»?Подстановочные знаки в Lucene

Следующий код, написанный на Jython для Lucene 3.0.0, не может получить индексированный документ. Я что-то упускаю?

analyzer = WhitespaceAnalyzer() 
directory = FSDirectory.open(java.io.File("testindex")) 
iwriter = IndexWriter(directory, analyzer, True, IndexWriter.MaxFieldLength(25000)) 

doc = Document() 
doc.add(Field("sentence", "dog#VVP", Field.Store.YES, Field.Index.ANALYZED)) 
iwriter.addDocument(doc) 
iwriter.close() 
directory.close() 

parser = QueryParser(Version.LUCENE_CURRENT, "sentence", analyzer) 
directory = FSDirectory.open(java.io.File("testindex")) 
isearcher = IndexSearcher(directory, True) # read-only=true 

query = parser.parse("dog#V*") 
hits = isearcher.search(query, None, 10).scoreDocs 
print query_text + ":" + ", ".join([str(x) for x in list(hits)]) 

Выход:

dog#V*: 

Он ничего не возвращает. Я вижу такое же поведение для собаки # VV * или с символами разделителей, отличными от «#» (я пробовал «__» и «aaa»). Интересно, что работают следующие запросы: dog # ???, dog # *.

ответ

3

Если вы внимательно смотрели на результат

parser.parse("dog#V*") 

вы бы видели

sentence:dog#v* 

Примечание нижнерегистровую V! Для того, чтобы избежать автоматического lowercasing терминов в запросе подстановочные, вы должны будете сделать

parser.setLowercaseExpandedTerms(False) 

перед разбором строки запроса. Я не знаю, почему значение по умолчанию имеет строчный формат.

+0

Спасибо! Это решает мою текущую проблему. Насколько я понимаю, LowerCase - это еще один фильтр в WhitespaceAnalysis. Я попытаюсь посмотреть, что произойдет, если я использую собственный собственный класс анализа (который будет использовать TurkishLowerCase), но есть ли кто-нибудь, кто мог бы объяснить механизм и обоснование этого умолчания? –

+2

@ Amaç - Обратите внимание, что нижняя область не является частью WhiteSpaceAnalyzer, а скорее поведением парсера запросов по умолчанию. Поэтому, если вы хотите изменить нижний регистр, вы должны либо установить флаг, как предложил Джонатан, либо написать собственный класс анализатора запросов. –

+0

И комментарий Юваля исправляет мое недоразумение о поведении нижних конечностей. Теперь все ясно, спасибо еще раз. –

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