我有一个List getter方法,我想将其(标记化)索引到许多字段中。
我有一个FieldBridge实现,它迭代列表并将每个字符串索引到一个字段中,索引附加到字段名称,为每个字符串指定一个不同的名称。
我有两个不同的Analyzer实现(CaseSensitiveNGramAnalyzer和CaseInsensitiveNGramAnalyzer),我想与这个FieldBridge一起使用(用于区分大小写和区分大小写的字段索引)。
这是我想将分析仪应用于的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);
}
}
我正在考虑以下几点,但我完全不熟悉字段标记流等。
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注释中指定Analyzer和FieldBridge(不包括上述分析器代码),但它似乎使用的是默认分析器而不是{ {1}}。
analyzer =
答案 0 :(得分:3)
解决方案atm是通过自定义范围分析器或 @AnalyzerDiscriminator 与 @AnalyzerDef 一起使用。这也在Hibernate搜索论坛上进行了讨论 - https://forum.hibernate.org/viewtopic.php?f=9&t=1016667
答案 1 :(得分:1)
我设法让这个工作。当指定analyzer =
和bridge =
时,Hibernate Search似乎不使用指定的Analyzer,至少在指定的桥创建多个字段时。
手动将TokenStream从所需的分析器传递到桥中生成的Fields,这得到了预期的结果:
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
在实现此方法之前实例化并存储在字段中。)