2013-04-18 21 views
0

我写这个代码我CustomAnalyzer的一部分:现在为什么这个代码 - 添加wordnet同义词索引 - 失败?

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 

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

我们如何解决这个问题?

回答

0

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

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

你甚至不需要运行reindexer。您可以定义一组您想要弄清楚的不同类型,然后针对这些类型直接运行对例句的分析。