Java 如何将Wordnet同义词用于Hibernate搜索?

Java 如何将Wordnet同义词用于Hibernate搜索?,java,hibernate,solr,lucene,hibernate-search,Java,Hibernate,Solr,Lucene,Hibernate Search,我一直在试图找出如何将WordNet同义词与我正在开发的使用HibernateSearch5.6.1的搜索功能结合使用。起初,我考虑使用Hibernate搜索注释: @TokenFilterDef(factory = SynonymFilterFactory.class, params = {@Parameter(name = "ignoreCase", value = "true"), @Parameter(name = "expand", value = "true"),@Paramet

我一直在试图找出如何将WordNet同义词与我正在开发的使用HibernateSearch5.6.1的搜索功能结合使用。起初,我考虑使用Hibernate搜索注释:

@TokenFilterDef(factory = SynonymFilterFactory.class, params = {@Parameter(name = "ignoreCase", value = "true"),
  @Parameter(name = "expand", value = "true"),@Parameter(name = "synonyms", value = "synonymsfile") })
但是,这需要使用同义词填充实际文件。从WordNet我只能得到.pl文件。因此,我尝试手动创建一个SynonymAnalyzer类,该类将从.pl文件中读取:

public class SynonymAnalyzer extends Analyzer {

@Override
protected TokenStreamComponents createComponents(String fieldName) {
  final Tokenizer source = new StandardTokenizer();
  TokenStream result = new StandardFilter(source);
  result = new LowerCaseFilter(result);

  SynonymMap wordnetSynonyms = null;

  try {
    wordnetSynonyms = loadSynonyms();
  } catch (IOException e) {
    e.printStackTrace();
  }
  result = new SynonymFilter(result, wordnetSynonyms, false);
  result = new StopFilter(result, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
  return new TokenStreamComponents(source, result);
}

private SynonymMap loadSynonyms() throws IOException {
  File file = new File("synonyms\\wn_s.pl");
  InputStream stream = new FileInputStream(file);
  Reader reader = new InputStreamReader(stream);
  SynonymMap.Builder parser = null;
  parser = new WordnetSynonymParser(true, true, new StandardAnalyzer(CharArraySet.EMPTY_SET));
  try {
    ((WordnetSynonymParser) parser).parse(reader);
  }   catch (ParseException e) {
    e.printStackTrace();
  }

  return parser.build();
}
}


这个方法的问题是我得到了java.lang.OutOfMemoryError,我假设这是因为同义词太多还是什么?正确的方法是什么?我在网上看到的所有地方都建议使用WordNet,但我似乎找不到Hibernate搜索注释的例子。感谢您的帮助,谢谢

同义过滤器工厂实际上支持wordnet格式。您只是缺少注释配置中的format参数;默认情况下,工厂使用Solr格式

将注释更改为:

@TokenFilterDef(
    factory = SynonymFilterFactory.class,
    params = {
        @Parameter(name = "ignoreCase", value = "true"),
        @Parameter(name = "expand", value = "true"),
        @Parameter(name = "synonyms", value = "synonymsfile"),
        @Parameter(name = "format", value = "wordnet") // Add this
    }
)
此外,请确保synonyms参数的值是类路径中的文件路径,例如com/acme/synonyms.pl,如果文件位于资源目录的根目录,则仅为synonyms.pl


一般来说,当您对Lucene过滤器/标记器工厂的参数有问题时,最好是查看该工厂的源代码,或者查看。

谢谢!正是我需要的。