2012-04-12 3 views
1

여러 필드로 색인화 (토큰 화)하려는 List getter 메소드가 있습니다.사용자 정의 FieldBridge 내에서 분석기 사용

필자는 목록을 반복하고 필드 이름에 인덱스가 추가 된 필드에 각 문자열을 인덱싱하여 필드 이름에 각각 다른 이름을 부여합니다.

이 FieldBridge와 함께 사용하려는 두 가지 Analyzer 구현 (CaseSensitiveNGramAnalyzer 및 CaseInsensitiveNGramAnalyzer) (대/소문자 구분 및 대/소문자 구분 안 함 필드 만들기)이 있습니다.

이것을 FieldBridge 내가에 분석기를 적용 할 수 있습니다 :

public class StringListBridge implements FieldBridge 
{ 

    @Override 
    public void set(String name, Object value, Document luceneDocument, LuceneOptions luceneOptions) 
    { 
     List<String> strings = (List<String>) value; 
     for (int i = 0; i < strings.size(); i++) 
     { 
     addStringField(name + 1, strings.get(i), luceneDocument, luceneOptions); 
     } 
    } 

    private void addStringField(String fieldName, String fieldValue, Document luceneDocument, LuceneOptions luceneOptions) 
    { 
     Field field = new Field(fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()); 
     field.setBoost(luceneOptions.getBoost()); 
     luceneDocument.add(field); 
    } 
} 
  • 그것은 FieldBridge를 사용하는 필드에 분석을 적용 할 수 있습니까?
  • 그렇다면 주석을 사용하여 수행 할 수 있습니까, 아니면 프로그래밍 방식으로 수행해야합니까?
  • 분석기를 매개 변수로 삽입 할 수 있습니까?

나는 다음의 라인을 따라 생각하지만, 모든 필드 토큰 스트림 등 :

private void addStringField(String fieldName, String fieldValue, Document luceneDocument, LuceneOptions luceneOptions) 
    { 
     Field field = new Field(fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()); 
     field.setBoost(luceneOptions.getBoost()); 
     try 
     { 
     field.setTokenStream(new CaseSensitiveNGramAnalyzer().reusableTokenStream(fieldName, new StringReader(fieldValue))); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
     luceneDocument.add(field); 
    } 

이 제정신 접근 방식에 익숙하지 오전입니까? 나는 @Field 주석 내에서 분석기 및 FieldBridge를 지정 시도

편집, 다음과 같이 (위의 분석 코드를 포함하지 않고는)하지만 analyzer =로 지정된보다는 기본 분석기를 사용하고있는 것으로 나타납니다.

@Fields({ 
     @Field(name="content-nocase", 
      index = Index.TOKENIZED, 
      analyzer = @Analyzer(impl = CaseInsensitiveNgramAnalyzer.class), 
      bridge = @FieldBridge(impl = StringListBridge.class)), 
     @Field(name = "content-case", 
      index = Index.TOKENIZED, 
      analyzer = @Analyzer(impl = CaseSensitiveNgramAnalyzer.class), 
      bridge = @FieldBridge(impl = StringListBridge.class)), 
    }) 
    public List<String> getContents() 

답변

1

나는이 작업을 할 수있었습니다. analyzer =bridge =이 둘 다 지정된 경우 Hibernate Search는 지정된 Analyzer를 사용하지 않습니다. 적어도 지정된 브리지가 여러 필드를 작성하는 경우입니다. 수동 다리에서 생성 된 필드에 원하는 분석기에서 TokenStream을 통과

나에게 예상 된 결과를 얻었다 :

private void addStringField(String fieldName, String fieldValue, Document luceneDocument, LuceneOptions luceneOptions) 
    { 
     Field field = new Field(fieldName, fieldValue, luceneOptions.getStore(), luceneOptions.getIndex(), luceneOptions.getTermVector()); 
     field.setBoost(luceneOptions.getBoost()); 

     // manually apply token stream from analyzer, as hibernate search does not 
     // apply the specified analyzer properly 
     try 
     { 
     field.setTokenStream(analyzer.reusableTokenStream(fieldName, new StringReader(fieldValue))); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
     luceneDocument.add(field); 
    } 

ParameterizedBridge (analyzer 인스턴스화하고 필드에 저장되어 사용할 분석기 지정 구현 이 메서드를 호출하기 전에).

+0

어떻게 분석기를 생성하는지 물어볼 수 있습니까? 프로그래밍 방식으로 또는 @AnalyzerDef로 만든 이름에 액세스하는 방법을 찾아 냈습니까? – HandyManDan

+0

@HandyManDan 오랫동안이 문제를 다루지는 않았지만 수동으로 인스턴스화 한 것처럼 보입니다.여기에 관련된 커밋이 있었는데, 커밋에 관련된 관련 정보가있을 수도 있고 수정 된 파일의 현재 버전 (아마도 색인 생성이 지난 해 다소 변경 되었음) 일 수도 있습니다. https : // github .com/zanata/zanata-server/commit/e4b9970393eaf7d2cbddc43048875a897aa7f236 –

+2

확인해 주셔서 감사합니다. 저는 브리지 구현 내부에서 AnalyzerDef로 만든 명명 된 분석기에 액세스 할 수있는 방법이 없다고 생각합니다. 이 문제는 https://hibernate.atlassian.net/browse/HSEARCH-1306 – HandyManDan

3

용액 ATM 사용자 정의 범위 분석기 또는 @AnalyzerDef 함께@AnalyzerDiscriminator를 통해 사용된다. 이것은 최대 절전 모드 검색 포럼에서도 논의됩니다 - https://forum.hibernate.org/viewtopic.php?f=9&t=1016667

+0

주소입니다. in.relation.to에도 블로그 게시물이 있습니다. http://in.relation.to/Bloggers/CustomAnalyzersForFieldsDefinedInClassOrFieldBridges – Hardy

+0

@AnalyzerDiscriminator 접근법을 사용하는 경우 주석이 속성이 아닌 전체 엔터티에 적용된다는 것을 알고 있어야합니다. getAnalyzerDefinitionName은 해당 엔티티의 모든 필드에 대해 호출됩니다. 즉 엔티티에 대해 둘 이상의 분석기가있는 경우 필드 param을보고 올바른 분석기를 반환해야합니다. – HandyManDan

관련 문제