2013-06-03 2 views
0

Lucene.Net에서 검색 결과를 제한하는 필터를 만들었습니다. 매우 이상한 문제가 발생했습니다. 필터가 텍스트 값과 작동하지 않지만 숫자 값으로 작업합니다.Lucene.Net에서 필터가 텍스트/문자열 값으로 작동하지 않는 이유는 무엇입니까?

예 :

다음과 같이 숫자 값으로 필터를 만들 경우. 그것은 완벽하게 작동합니다.

String field = "id"; 
Filter LE= new QueryWrapperFilter(new TermQuery(new Term(field, "1234567"))); 
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll); 

그러나, 나는 텍스트

가 실패
String field = "id"; 
Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y"))); 
indexSearcher.Search(QueryMaker(searchString, searchfields), LE, coll); 

를 포함하는 값을 제공합니다. 결과에 레코드가 표시되지 않습니다.

누군가 내게이 문제를 설명 할 수 있습니까? 또한 나는이 주장을하기 위해 여러 번 시험했다. 일부 포럼에서 Lucene 버전 3 이하 용어 쿼리에이 문제가있을 것이라고 읽었습니다. 그러나 버전을 3.0.3으로 변경했지만 오류는 계속 발생합니다. 내 프로그램에서 필자의 필터가 제대로 작동 할 필요가있다. 그렇지 않으면 나는 Lucene에서 벗어나 다른 것을 찾아야 할 것이다.

+0

너무 다른 모든 필터를 시도했다. 심지어 부울 필터. 단순히 텍스트 값으로는 작동하지 않습니다. – Huzaifa

+0

콘텐츠를 색인 생성 할 때 사용하는'분석가 '는 무엇입니까? 사용중인 토큰이 예상대로 토큰을 생성하지 않을 수도 있습니다 (예 : 텍스트를 소문자로 변환). 또한, 왜 QueryMaker를 사용하고 있습니까? 나는'String field = "id"와 같은 간단한 것을 생각했다; indexSearcher.search (new TermQuery (new Term (field, "ZZZOCB9X9Y"))); Lucene.net을 사용하지는 않지만 Lucene Core (Java) 만 사용할 수도 있습니다. –

+0

[여기에 표시] (http://stackoverflow.com/a/6469223/1250033)와 같이 쿼리 성능이 향상되는 것을 피할 수 있으면 필터를 사용하지 마십시오. 또한,'TermQuery'를 사용하면 Lucene에 대해 raw 값을 보내고, 문자 그대로 일치시킬 필요가 있습니다. 대신에'QueryParser'를 사용할 수 있습니까? – rae1

답변

3

StandardAnalyzerTokenStream의 모든 문자를 소문자로 처리합니다.

이 시도 :

Filter LE = new QueryWrapperFilter(new TermQuery(new Term(field, "ZZZOCB9X9Y".ToLowerInvariant()))); 
+0

마법처럼 작동합니다. 와우!!!! 너무 많이 고마워. 어떤 구호. 그 대답. 다시 한번 고마워. 오랜 시간이 지났을 때 나는 그것에 미쳐 가고있었습니다. 정확하게 토큰을 저장하려면 어떤 분석기를 사용해야합니까? 그것을 권하고 싶습니까? – Huzaifa

+0

Field.Index 생성자 매개 변수를 만들 때 Field.Index.NOT_ANALYZED로 설정하면 그대로 인덱싱됩니다. 동일한 동작을하는 KeywordAnalyzer()도 있습니다. –

+0

성능에 영향을 줍니까? – Huzaifa