elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

对于Lucene,如果有人搜索;“红谷仓”;,如何返回包含“的结果?”;“红谷仓”;?

对于Lucene,如果有人搜索;“红谷仓”;,如何返回包含“的结果?”;“红谷仓”;?,lucene,elasticsearch,Lucene,elasticsearch,我有一个工作搜索,如果有人搜索两个单独的词(如“red barn”),Lucene会很好地返回“red barn”、“barn red”和“big brown barn旁边的红色拖拉机”的记录。这很好,但结果不会返回任何包含“redbarn”的内容(除非您专门搜索“redbarn”),但你不会得到“红色谷仓”记录) 我目前正在使用标准分析器,但不确定需要更改什么才能获得我想要的所有记录 如果有必要的话,我正在使用ElasticSearch(引擎盖下的Lucene)之上的NEST客户端。我已经研究

我有一个工作搜索,如果有人搜索两个单独的词(如“red barn”),Lucene会很好地返回“red barn”、“barn red”和“big brown barn旁边的红色拖拉机”的记录。这很好,但结果不会返回任何包含“redbarn”的内容(除非您专门搜索“redbarn”),但你不会得到“红色谷仓”记录)

我目前正在使用标准分析器,但不确定需要更改什么才能获得我想要的所有记录


如果有必要的话,我正在使用ElasticSearch(引擎盖下的Lucene)之上的NEST客户端。我已经研究了各种可用的分析器和属性,但还没有找到正确的组合来实现这一点。

最好的方法是编写一个将“redbarn”标记为[“红色”,“barn”]的分析器.Lucene已经为德语提供了这一功能,例如,您可以查看。

标准分析器适用于大多数情况,但如果您需要详细的文本分析,则需要编写自己的分析器

Solr附带的过滤器应该可以解决您的问题。Solr构建在lucene之上,因此如果您使用Solr附带的过滤器,您应该不会遇到问题。请参见下面的示例:

public class CustomAnalyzer extends Analyzer { 
  public TokenStream tokenStream(String fieldName, Reader reader) { 
    TokenStream ts = new WhitespaceTokenizer(reader); 
    ts = new WordDelimiterFilter(ts, 1, 1, 1, 1, 1); 
    ts = new LowerCaseFilter(ts); 
    return ts; 
  } 
} 

OP特别询问如何使用ElasticSearch实现这一点。以下是如何在ElasticSearch中实现这一点,