我将此代码编写为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的同义词的文档。
我们如何解决这个问题?
答案 0 :(得分:0)
如果在查询处理期间没有同义词构建器,那么它将匹配的唯一术语是您在索引编制期间映射到的内容。你没有在这里展示这一部分。
解决此问题的最佳方法是查看Admin / Core / Analysis屏幕(在Solr 4+中)并将文本放入。它将显示在索引和查询运行的每个阶段之后文本会发生什么。
您甚至不需要运行reindexer。您可以定义一堆您想要弄清楚的不同类型,然后直接针对这些类型运行样本句子的分析。