【问题标题】:Lucene Search: Associate different words to a termLucene Search:将不同的词关联到一个词条
【发布时间】:2015-09-11 10:30:17
【问题描述】:
我正在使用 Atlassian Confluence,它使用 Lucene 作为搜索引擎。
我想将单词列表与特定搜索词相关联。
示例:用户搜索“DNA”,然后我希望 lucene 在表格中查找是否有 DNA 字段...在 DNA 旁边是“DNS”(这是德语术语)。在此查找之后,lucene 应该搜索 DNA 或 DNS。
背景:我们公司是国际化的,来自丹麦的人应该找到用德语写的内容。
我现在必须自己设置这些索引。没关系,只是使用了一些特殊的词,所以我们可以处理关联。
【问题讨论】:
标签:
search
lucene
associations
【解决方案1】:
您可以在分析器中使用 SynonymFilter。
每次搜索“DNA”时,按照示例的 sn-ps 也搜索“DNS”
- 首先,您必须创建 SynonymMap,在其中声明同义词 (DNA--> DNS)
SynonymMap.Builder sb = new SynonymMap.Builder ( true );
sb.add ( new CharsRef("DNA"), new CharsRef("DNS"), true );
// ...add here others synonyms
SynonymMap synonymMap = sb.build();
- 然后,您必须创建一个 SynonymAnalyzer 类。该类的构造函数接收之前创建的 SynonymMap
public class SynonymAnalyzer extends Analyzer {
public static final Version version = Version.LUCENE_47;
private SynonymMap synonyms;
public SynonymAnalyzer(SynonymMap synonyms) {
setSynonyms(synonyms);
}
@Override protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
TokenStreamComponents result = null;
WhitespaceTokenizer source = new WhitespaceTokenizer(version, reader);
SynonymFilter filter = new SynonymFilter(source, getSynonyms(), true);
result = new TokenStreamComponents(source, filter);
return result;
}
public SynonymMap getSynonyms() {
return synonyms;
}
protected void setSynonyms(SynonymMap synonyms) {
this.synonyms = synonyms;
}
}