2011-10-12 2 views
3

나는 내가 지금처럼 루씬과 색인 오전 필드가 단어는 구두점을 토큰 화하고 "not"를 무시하기 때문에 hungry, slightly으로 끝납니다.루씬 분석기

인덱스를 index=Index.UN_TOKENIZED으로 변경하면 인덱싱 된 용어는 예상대로 HUNGRY, SLIGHTLY_HUNGRY, and NOT_HUNGRY입니다.

내 검색 API있는 Query과 같이 구성한다 (1) "검색"방법 :

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), new StandardAnalyzer(Version.LUCENE_30)); 
parser.setDefaultOperater(QueryParser.AND_OPERATOR); 
Query query = parser.parse(searchTerms); 

이것은 검색을 처리하는 곳 "foo는"에 getSearchFields()에 의해 반환되는 모든 필드를 검색의 SearchTerms = "foo는"하고, 또한 searchTerms가 검색 할 필드와 값을 지정합니다 (예 : "hungerState : HUNGRY")

내 문제는 후자의 시나리오입니다. 쿼리 파서가 StandardAnalyzer를 사용하기 때문에 hungerState:SLIGHTLY_HUNGRY에 대한 검색은 hungerState:"slightly hungry"으로 파싱되고 hungerState=NOT_HUNGRY에 대한 검색은 hungerState=hungry으로 파싱됩니다.

필드가 StandardAnalyzer를 사용하여 색인화 될 때 예기치 않은 결과가 발생합니다 (HUNGRY 및 NOT_HUNGRY 검색은 3 가지 값 모두에 대한 결과를 반환합니다). 필드가 UN_TOKENIZED로 인덱싱되면 쿼리 구문 분석기가 검색 문자열을 토큰 화하고 소문자로 만들기 때문에 결과가 표시되지 않습니다.

나는 심지어 KeywordAnalyzer과 같은 색인 생성을 위해 분석기를 지정하려고 시도했지만 심지어는 전체 검색 문자열이 매번 StandardAnalyzer으로 분석되기 때문에 아무런 효과가 없습니다.

모든 조언을 주시면 감사하겠습니다. 감사!

답변

2

쿼리 파서에 표준 분석기를 사용하고 있으므로 쿼리가 표준 분석기로 분석됩니다. 그냥 키워드 분석기를 사용하여 전환 :

MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, getSearchFields(), 
      new KeywordAnalyzer(Version.LUCENE_30)); 

당신은 다른 필드 키워드를하지 않을 경우 PerFieldAnalyzerWrapper을 사용할 수 있습니다.

+0

StandardAnalyzer가 다른 모든 필드에 적합하기 때문에 PerFieldAnalyzerWrapper가 꼭 필요한 항목입니다. – schmimd04