2013-06-18 3 views
1

나는 색인/질의 중에 악센트를 제거하는 방법에 대한 다양한 스레드를 읽었습니다. 나는 다음과 같은 외모와 함께 온 현재의 fieldtype는 :Solr 악센트 제거

<fieldType name="text_general" class="solr.TextField">  
    <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
      <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer>  
</fieldType> 

인덱스에 테스트 정보의 몇 가지를 추가 한 후 내가 토큰의 종류가 생성 된 http://localhost:8080/solr/test_core/admin/luke?fl=title

를 통해 확인했다. 예를 들어 는 "바이에른 뮌헨"와 같은 제목으로 토큰 화되었습니다의 아스키 펜던트로 문자를 대체하는 따라서 대신

<int name="bayern">1</int> 
<int name="m">1</int> 
<int name="nchen">1</int> 

, 그것은 구분 것으로 해석하고있다?! 그런 종류의 색인 결과를 얻는다면 "뮌헨"이나 "뮌헨"을 검색 할 수 없습니다.

어떻게 수정해야합니까? 미리 감사드립니다.

답변

7

ASCIIFoldingFilterFactory을 적용하기 전에 StandardTokenizerFactory을 적용하는 것이 문제입니다. 대신 MappingCharFilterFactory 문자 필터 팩토리를 먼저 사용하고 StandardTokenizerFactory을 사용해야합니다.

Solr Reference guideStandardTokenizerFactory에 따라 <ALPHANUM>, <NUM>, <SOUTHEAST_ASIAN>, <IDEOGRAPHIC>, and <HIRAGANA>을 지원합니다. 따라서 StandardTokenizerFactory을 사용하여 토큰 화하면 움 라이트 문자가 손실되고 그 이후에 ASCIIFoldingFilterFactory은 사용되지 않습니다.

으로 가고 싶다면 fieldType은 아래와 같아야합니다.

<fieldType name="text_general" class="solr.TextField">  
    <analyzer> 
      <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory" /> 
    </analyzer>  
</fieldType> 

mapping-ISOLatin1Accent.txt에는 이러한 "특수"문자에 대한 매핑이 있어야합니다. Solr에서이 파일은 기본적으로 미리 채워집니다. 예 : ü -> ue, ä -> ae

+0

답변 해 주셔서 감사합니다. 그러나 MappingCharFilterFactory는 적용되지 않는 것 같습니다. post.jar를 통해 인덱스를 업데이트하여 인덱스에 추가 할 내용이있는 json 파일을 보내야합니다. Standardtokenizer를 WhitespaceTokenizerFactory로 대체했기 때문에 문자열은 악센트에 토큰 화되지 않지만 매핑 ISOLatin1Accent.txt의 내용으로 대체되지 않습니다. – user2148322

+0

WhitespaceTokenizerFactory를 사용하는 경우 ASCIIFoldingFilterFactory를 사용할 수 있습니다. fieldType과 마찬가지로, StandardTokenizerFactory를 WhitespaceTokenizerFactory로 바꿉니다. – JHS

+0

나는 MappingCharFilterFactory와 ASCIIFoldingFilter가있는 손으로 title 필드와 content_type 필드에 다른 필드 유형을 적용했다. 두 변형은 여전히 ​​작동하지 않습니다. 에 http : // localhost를 : 8080/SOLR/test_core/관리/루크 FL = 제목, 콘텐츠 _ 1 콘텐츠 _ 필드에서 및 1 (소문자 필터 사용) – user2148322