[英]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分析仪 。
我认为收缩和所有格对于标准分析仪可能是有问题的,因为它们是特定于语言的。 相比:
因此, 特定于语言的分析器可能是最佳解决方案。 EnglishAnalyzer包含EnglishPossessiveFilter,它应该处理这种情况。
您可以设置英语分析仪,例如:
index :
analysis :
analyzer :
english :
type : english
stopwords : [...]
stem_exclusion : [...]
stopwords
和stem_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.