Java 使用lucene同义词筛选器时无法标记单词

Java 使用lucene同义词筛选器时无法标记单词,java,lucene,Java,Lucene,如果我使用这个同义词分析器,并且搜索dns是down,则形成的查询是+n:domain-name-system+n:is+n:down。域名系统未标记为单独的标记,但我需要将其作为单独的标记。添加多单词同义词时,需要使用同义词映射将单词分隔。单词分隔符: public class SynonymAnalyzer extends Analyzer { @Override protected TokenStreamComponents createComponents(Strin

如果我使用这个同义词分析器,并且搜索dns是down,则形成的查询是+n:domain-name-system+n:is+n:down。域名系统未标记为单独的标记,但我需要将其作为单独的标记。

添加多单词同义词时,需要使用同义词映射将单词分隔。单词分隔符:

public class SynonymAnalyzer extends Analyzer {


    @Override
    protected TokenStreamComponents createComponents(String s, Reader reader) {
        SynonymMap synonymMap = null;
        SynonymMap.Builder builder=null;
        try {
            addTo(builder,new String[]{"dns"},new String[]{"domain name system"});
            synonymMap = builder.build();
        }catch (Exception e) {
            e.printStackTrace();
        }
        Tokenizer tokenizer = new StandardTokenizer(reader);
        TokenStream filter = new SynonymFilter(tokenizer, synonymMap, true);
        return new TokenStreamComponents(tokenizer, filter);
    }

     private void addTo(SynonymMap.Builder builder, String[] from, String[] to) {
         for (String input : from) {
             for (String output : to) {
                 builder.add(new CharsRef(input), new CharsRef(output), false);
             }
         }
     }
 }

(顺便说一句,您的
createComponents
,在编写时,将抛出一个NPE。根据您编写的内容判断,我假设这是示例中的一个错误,而不是生产中的代码)

它将域名系统作为单个令牌返回。但是我需要它作为单独的标记,反过来使用lucene 4.10.4可以吗?我可以将域名系统转换为dns吗?
addTo(builder,new String[]{"dns"},new String[]{
    "domain" + SynonymMap.WORD_SEPARATOR
    + "name" + SynonymMap.WORD_SEPARATOR
    + "system"});