Lucene搜索:将不同的单词与术语相关联

时间:2015-09-11 10:30:17

标签: search lucene associations

我正在使用Atlassian Confluence,它使用Lucene作为searchengine。

我想将一个单词列表与特定的搜索词相关联。

示例:用户搜索“DNA”,然后我希望lucene在表中查看是否存在DNA字段...在DNA旁边是“DNS”(这是德语术语)。在此查找之后,lucene应该搜索DNA或DNS。

背景:我们公司是国际性的,丹麦人应该找到用德语写的内容。

我现在必须自己设置这些索引。多数民众赞成,只使用了一些特殊的词,所以我们可以处理这种关联。

1 个答案:

答案 0 :(得分:0)

您可以在分析仪中使用SynonymFilter。

按照示例的片段搜索" DNS"每当你搜索" DNA"

  • 首先,您必须创建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;
  }

}
  • 最后,当你搜索一个术语" 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 );