使用NEST进行弹性搜索 - 如何在搜索时忽略标点符号

时间:2014-02-27 16:22:40

标签: .net elasticsearch nest

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

示例文件:

{ 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

2 个答案:

答案 0 :(得分:2)

我认为标准分析仪的收缩和占有可能会有问题,因为它们非常适合语言。比较:

  • 英文:“乔的惊人文件”
  • 西班牙语:“documento impresionante de Joe”
  • 德语:“Joe erstaunliche dokument”)。

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

您可以设置英语分析器,例如:

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

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

答案 1 :(得分:0)

感谢femtoRgon指向正确的方向,这是我最终在NEST和Snowball分析仪中使用的解决方案:

首先,我在文档类的属性中添加了这些属性,我希望使用分析器:

[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仅在使用上述属性索引/查询字段时应用这些分析器。