0

我正在编写此代码作为我的 CustomAnalyzer 的一部分:

public class CustomAnalyzer extends Analyzer {

SynonymMap mySynonymMap = null;

CustomAnalyzer() throws IOException {
    SynonymMap.Builder builder = new SynonymMap.Builder(true);

    FileReader fr = new FileReader("/home/watsonuser/Downloads/wordnetSynonyms.txt");
    BufferedReader br = new BufferedReader(fr);
    String line = "";

    while ((line = br.readLine()) != null) {
      String[] synset = line.split(",");
      for(String syn: synset)
          builder.add(new CharsRef(synset[0]), new CharsRef(syn), true);
    }

    br.close();
    fr.close();

    try {
        mySynonymMap = builder.build();
    } catch (IOException e) {
        System.out.println("Unable to build synonymMap");
        e.printStackTrace();
    }
}

public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = new PorterStemFilter(new SynonymFilter(
                                              (new StopFilter(true,new LowerCaseFilter
                                               (new StandardFilter(new StandardTokenizer
                                                 (Version.LUCENE_36,reader)
                                                )
                                               ),StopAnalyzer.ENGLISH_STOP_WORDS_SET)), mySynonymMap, true)
                                               );


}
}

现在,如果我在查询中使用相同的 CustomAnalyzer,那么如果我输入查询为

myFieldName: manager

它使用经理的同义词扩展查询。

但是,我希望同义词只是我的索引的一部分,我不希望我的查询被同义词扩展。

因此,当我仅在查询索引时从我的 CustomAnalyzer 中删除 SynonymFilter 时,查询仍然为

myFieldName: manager

但是,它无法检索具有 manager 同义词的文档。

我们如何解决这个问题?

4

1 回答 1

0

如果您在查询处理期间没有同义词构建器,那么它将匹配的唯一术语是您在索引期间映射到的术语。你没有在这里展示那部分。

解决此问题的最佳方法是查看 Admin/Core/Analysis 屏幕(在 Solr 4+ 中)并输入您的文本。它将显示在运行索引和查询的每个阶段后文本会发生什么。

您甚至不需要运行 reindexer。您可以只定义一堆您试图找出的不同类型,然后直接针对这些类型运行示例句子的分析。

于 2013-04-18T18:52:34.260 回答