Подстановочные знаки в Lucene - PullRequest
4 голосов
/ 18 января 2010

Почему подстановочный запрос "dog # V *" не может получить документ, содержащий "dog # 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*: 

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

1 Ответ

3 голосов
/ 18 января 2010

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

parser.parse("dog#V*")

, вы бы увидели

sentence:dog#v*

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

parser.setLowercaseExpandedTerms(False)

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

...