2010-01-17 12 views
4

와일드 카드 쿼리 "dog # V *"가 "dog # VVP"가 포함 된 문서를 검색하지 못하는 이유는 무엇입니까?Lucene의 와일드 카드

자이 썬에서 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 # *. 당신이

parser.parse("dog#V*") 

의 결과를주의 깊게보고 싶다면

답변

3

당신은

sentence:dog#v* 

참고 소문자 V를 본 것! 와일드 카드 쿼리 용어의 자동 lowercasing을 방지하기 위해, 당신은 쿼리 문자열을 구문 분석하기 전에

parser.setLowercaseExpandedTerms(False) 

을해야 할 것이다. 기본값이 왜 소문자인지 알 수 없습니다.

+0

고마워요! 그건 내 현재의 문제를 해결합니다. LowerCase가 WhitespaceAnalysis의 또 다른 필터라는 것을 이해하는 한. 나는 자신의 커스텀 Analysis 클래스 (TurkishLowerCase를 사용할 것입니다)를 사용한다면 어떻게 될지를 시도 할 것입니다. 그렇지만이 디폴트의 배경과 메커니즘을 설명 할 수있는 사람은 누구입니까? –

+2

@ Amaç - 소문자는 WhiteSpaceAnalyzer의 일부가 아니라 쿼리 구문 분석기의 기본 동작입니다. 따라서 소문자 변환을 변경하려면 Jonathan이 제안한대로 플래그를 설정하거나 자체 쿼리 파서 클래스를 작성해야합니다. –

+0

그리고 Yuval의 의견은 lowercasing 동작에 대한 오해를 바로 잡습니다. 이제는 모든 것이 명확 해졌습니다. 다시 한번 감사드립니다. –