繁体   English   中英

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

[英]Elasticsearch with NEST - How to ignore punctuation when searching

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

示例文件:

{ name: "joe's amazing document" }

当使用标准分析器查询"joe's amazing document"此方法很好用,但是,如果用户键入"joes amazing document"这不是完全匹配,并且文档在其他低分匹配中丢失。

到目前为止,我一直都没有找到如何使用NEST进行搜索的方法-我怀疑我可能需要使用诸如此类的char_filter 但是从NEST项目源中查看测试,我看不到如何添加自己的具有我自己的指定映射的自定义char_filter,它似乎只允许我指定Elasticsearch已经知道的过滤器(扩展CharFilterBase仅允许指定要使用的现有过滤器的名称)

谁能指出我在这里所做的正确方向? 我知道我可能会解决所有错误,因此任何帮助都将非常有用-我可以使用NEST或Elasticsearch进行此操作,还是需要以某种方式自定义Elasticsearch? 还是有我无法找到的解决方案? 谢谢!

更新:由于femtoRgon的回答为我指明了正确的方向,请参阅下面的答案 ,了解如何在NEST中使用Snowball分析仪

我认为收缩和所有格对于标准分析仪可能是有问题的,因为它们是特定于语言的。 相比:

  • 英语:“乔的惊人记录”
  • 西班牙语:“ Documento impresionante de Joe”
  • 德语:“ Joe erstaunliche dokument”)。

因此, 特定语言的分析器可能是最佳解决方案。 EnglishAnalyzer包含EnglishPossessiveFilter,它应该处理这种情况。

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

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

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

感谢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仅在对具有上述属性的字段进行索引/查询时才应用这些分析器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM