Lucene Search:将不同的词与术语相关联
Lucene Search: Associate different words to a term
我正在使用 Atlassian Confluence,它使用 Lucene 作为搜索引擎。
我想将单词列表与特定搜索词相关联。
示例:用户搜索 "DNA",然后我希望 lucene 在 table 中查找是否有 DNA 字段...在 DNA 旁边 "DNS" (这是德语术语)。查找之后,lucene 应该搜索 DNA 或 DNS。
上下文:我们公司是国际公司,丹麦人应该找到用德语写的内容。
我现在必须自己设置这些索引。没关系,只是用到了一些特殊的词,所以我们可以处理联想。
您可以在分析器中使用 SynonymFilter。
每次搜索 "DNA"
时,也按照示例片段搜索 "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 class。此 class 的构造函数接收先前创建的 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;
}
}
最后,当您搜索术语 "DNA" 并应用 SynonymAnalyzer 时,查询将使用同义词进行扩展。
IndexReader reader = DirectoryReader.open ( yourIndex );
IndexSearcher searcher = new IndexSearcher ( reader );
SynonymAnalyzer analyzer = new SynonymAnalyzer ( synonymMap );
QueryParser query = new QueryParser ( version, "yourDftField", analyzer );
Query queryParsed = query.parse ( "DNA" );
TopDocs topDocs = searcher.search ( queryParsed, 10 );
我正在使用 Atlassian Confluence,它使用 Lucene 作为搜索引擎。
我想将单词列表与特定搜索词相关联。
示例:用户搜索 "DNA",然后我希望 lucene 在 table 中查找是否有 DNA 字段...在 DNA 旁边 "DNS" (这是德语术语)。查找之后,lucene 应该搜索 DNA 或 DNS。
上下文:我们公司是国际公司,丹麦人应该找到用德语写的内容。
我现在必须自己设置这些索引。没关系,只是用到了一些特殊的词,所以我们可以处理联想。
您可以在分析器中使用 SynonymFilter。
每次搜索 "DNA"
时,也按照示例片段搜索 "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 class。此 class 的构造函数接收先前创建的 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; } }
最后,当您搜索术语 "DNA" 并应用 SynonymAnalyzer 时,查询将使用同义词进行扩展。
IndexReader reader = DirectoryReader.open ( yourIndex ); IndexSearcher searcher = new IndexSearcher ( reader ); SynonymAnalyzer analyzer = new SynonymAnalyzer ( synonymMap ); QueryParser query = new QueryParser ( version, "yourDftField", analyzer ); Query queryParsed = query.parse ( "DNA" ); TopDocs topDocs = searcher.search ( queryParsed, 10 );