2014-02-27 85 views
1

使用Elasticsearch我试图用用户提供的字符串查询索引。我的文档包含标点符号,我想保留这些标点符号,以便在检索时能正确显示,但我不希望该标点符号影响任何搜索结果,而不管它是否在查询中提供。例如:Elasticsearch与NEST - 如何在搜索时忽略标点符号

实施例的文档:

{ name: "joe's amazing document" } 

当查询使用标准分析器,用于"joe's amazing document"这样工作得很好,但是,如果在"joes amazing document"此用户类型是不完全匹配和文档丢失除其他低 - 比赛比赛。

我一直在寻找无济于事到目前为止找到如何与NEST做到这一点 - 我怀疑我可能需要使用char_filter such as this,但看着从NEST项目源测试我看不到如何添加用我自己指定的映射自己的定制char_filter,似乎只允许我指定Elasticsearch已经知道(扩展CharFilterBase只允许指定现有的过滤器的名称使用)

任何人都可以点我的一个过滤器正确的方向与我想在这里做什么?我知道我可能会这样做都是错误的,所以任何帮助都会很棒 - 我可以用NEST或Elasticsearch以某种方式做到这一点,还是我需要以某种方式定制Elasticsearch?或者有没有我刚才找不到的解决方案?谢谢!

更新:感谢femtoRgon的答案指向我朝着正确的方向,请参阅my answer下文,了解如何在NEST使用Snowball analyzer

回答

0

由于femtoRgon指着我在正确的方向,这里是我结束了使用NEST解决方案和雪球分析仪:

首先我说我的文档类的属性,我想用分析仪这些属性:

[ElasticType] 
public class MyIndexItem { 
    [ElasticProperty(IndexAnalyzer = "snowball", SearchAnalyzer = "snowball")] 
    public string Name { get; set; } 
} 

然后我重新利用这些属性映射的所有索引:

_client.CreateIndex(IndexName, s => s 
    .AddMapping<MyIndexItem>(m => m.MapFromAttributes()) 
); 

最后我能够索引和以正常的方式查询,不需要额外的配置,Elasticsearch只在索引/查询具有上述属性的字段时应用这些分析器。

2

我相信对于标准分析仪来说,收缩和所有物可能会有问题,因为它们很适合语言。比较:

  • 英语: “乔的惊人文件”
  • 西班牙语: “这份执行impresionante去乔”
  • 德国: “乔erstaunliche库门”)。

因此,language specific analyzer可能是最好的解决方案。 EnglishAnalyzer包含一个EnglishPossessiveFilter,它应该处理这种情况。

您可以设置一个英语分析是这样的:

index : 
    analysis : 
     analyzer : 
      english : 
       type : english 
       stopwords : [...] 
       stem_exclusion : [...] 

stopwordsstem_exclusion都是可选的。当然,确保在索引和查询时使用相同的分析器。

+0

谢谢你,但我发现它只能用其他方式 - 例如。如果文档包含“joe amazing document”,并且查询是针对所有格形式的“joe的惊人文档”(有或没有撇号),那么英语分析师正确地指出这应该仍然是最佳匹配。但是,如果文档包含所有格形式“joe的惊人文档”,则“joes ...”的查询不匹配。我想我会继续尝试,谢谢。 – embee

+0

这看起来很奇怪。我猜想,你可能会遇到一些奇怪的事情。有一些古怪的案件,它不处理完美。你确定你的英语分析器也被应用于查询吗? – femtoRgon

+0

是的我正在使用完全相同的数据测试两个索引上的各种情况,一个使用每个分析器,然后使用相关分析器在每个分析器上运行查询。当查询包含所有格而数据不包含时,我只注意到两组评分和结果顺序之间的差异。 – embee