Подстановочные знаки в Lucene

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

Следующий код, написанный на 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*: 

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


person Ruggiero Spearman    schedule 17.01.2010    source источник


Ответы (1)


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

parser.parse("dog#V*")

ты бы видел

sentence:dog#v*

Обратите внимание на строчную букву v! Чтобы избежать автоматического перевода терминов в нижний регистр в запросе с подстановочными знаками, вам нужно будет сделать

parser.setLowercaseExpandedTerms(False)

перед разбором строк запроса. Я понятия не имею, почему по умолчанию используется нижний регистр.

person Jonathan Feinberg    schedule 18.01.2010
comment
Спасибо! Это решает мою текущую проблему. Насколько я понимаю, LowerCase — это просто еще один фильтр в WhitespaceAnalysis. Я попытаюсь посмотреть, что произойдет, если я использую свой собственный класс Analysis (который будет использовать TurkishLowerCase), но есть ли кто-нибудь, кто мог бы объяснить механизм и обоснование этого значения по умолчанию? - person Ruggiero Spearman; 18.01.2010
comment
@Amaç - Обратите внимание, что нижний регистр НЕ является частью WhiteSpaceAnalyzer, а скорее является поведением анализатора запросов по умолчанию. Поэтому, если вы хотите изменить нижний регистр, вы должны либо установить флаг, как предложил Джонатан, либо написать свой собственный класс анализатора запросов. - person Yuval F; 18.01.2010
comment
И комментарий Юваля исправляет мое неправильное понимание поведения в нижнем регистре. Теперь все ясно, еще раз спасибо. - person Ruggiero Spearman; 18.01.2010