私は、いくつかのフィールドにインデックス付け(トークン化)したいList getterメソッドを持っています。カスタムFieldBridge内でアナライザを使用する
私はリストを反復処理し、フィールド名にインデックスを付加したフィールドに各文字列をインデックス付けして、それぞれに異なる名前を付けるFieldBridge実装を持っています。
私はこのフィールドブリッジで大文字と小文字を区別しない大文字と小文字を区別しないインデックスを作成するために、2つの異なる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);
}
これは正気のアプローチですか?
EDIT以下のようにI(上記分析コードを含むことなく)@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