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 );