여러 필드로 색인화 (토큰 화)하려는 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()
어떻게 분석기를 생성하는지 물어볼 수 있습니까? 프로그래밍 방식으로 또는 @AnalyzerDef로 만든 이름에 액세스하는 방법을 찾아 냈습니까? – HandyManDan
@HandyManDan 오랫동안이 문제를 다루지는 않았지만 수동으로 인스턴스화 한 것처럼 보입니다.여기에 관련된 커밋이 있었는데, 커밋에 관련된 관련 정보가있을 수도 있고 수정 된 파일의 현재 버전 (아마도 색인 생성이 지난 해 다소 변경 되었음) 일 수도 있습니다. https : // github .com/zanata/zanata-server/commit/e4b9970393eaf7d2cbddc43048875a897aa7f236 –
확인해 주셔서 감사합니다. 저는 브리지 구현 내부에서 AnalyzerDef로 만든 명명 된 분석기에 액세스 할 수있는 방법이 없다고 생각합니다. 이 문제는 https://hibernate.atlassian.net/browse/HSEARCH-1306 – HandyManDan