【问题标题】: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;
      }
    
    }
    
    • 最后,当您搜索术语“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 );
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2012-05-29
      • 2014-12-19
      • 2021-04-24
      • 2023-03-22
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多