在自定义FieldBridge中使用分析器

时间:2012-04-12 06:07:05

标签: hibernate-search analyzer

我有一个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);
   }
}
  • 是否可以将分析器应用于使用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注释中指定Analyzer和FieldBridge(不包括上述分析器代码),但它似乎使用的是默认分析器而不是{ {1}}。

analyzer =

2 个答案:

答案 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在实现此方法之前实例化并存储在字段中。)