.net Elasticsearch with NEST-如何在搜索时忽略标点符号
使用Elasticsearch,我试图用用户提供的字符串查询索引。我的文档包含我希望保留的标点符号,以便在检索时正确显示,但是我不希望该标点符号影响任何搜索结果,无论查询中是否提供了该标点符号。例如: 示例文件:.net Elasticsearch with NEST-如何在搜索时忽略标点符号,.net,
elasticsearch,nest,.net,
elasticsearch,Nest,使用Elasticsearch,我试图用用户提供的字符串查询索引。我的文档包含我希望保留的标点符号,以便在检索时正确显示,但是我不希望该标点符号影响任何搜索结果,无论查询中是否提供了该标点符号。例如: 示例文件: { name: "joe's amazing document" } 当使用标准分析器查询“joe's Azing document”时,这可以正常工作,但是如果用户键入“joes Azing document”这不是一个精确的匹配,文档会在其他低得分匹配中丢失 到目前为止,我一直在
{ name: "joe's amazing document" }
当使用标准分析器查询“joe's Azing document”
时,这可以正常工作,但是如果用户键入“joes Azing document”
这不是一个精确的匹配,文档会在其他低得分匹配中丢失
到目前为止,我一直在搜索如何使用NEST实现这一点,但毫无效果——我怀疑我可能需要使用char_过滤器,但查看NEST项目源代码中的测试,我看不到如何使用我自己指定的映射添加我自己的自定义char_过滤器,它似乎只允许我指定Elasticsearch已经知道的过滤器(扩展仅允许指定要使用的现有筛选器的名称)
有人能告诉我我在这里要做的事情的正确方向吗?我知道我可能做得不对,所以任何帮助都是很好的-我能用NEST或Elasticsearch来做这件事吗?或者我需要定制Elasticsearch吗?或者有没有一个解决方案,我只是找不到?谢谢
更新:多亏femtoRgon的回答为我指明了正确的方向,请参见下文了解如何使用in-NEST。我认为收缩和所有格对于standard analyzer可能会有问题,因为它们非常特定于语言。比较:
- 中文:“乔的惊人文件”
- 西班牙文:“乔的契约文件”
- 德语:“Joe erstaunliche dokument”)李>
index :
analysis :
analyzer :
english :
type : english
stopwords : [...]
stem_exclusion : [...]
stopwords
和stem\u 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())
);
\u client.CreateIndex(IndexName,s=>s
.AddMapping(m=>m.MapFromAttributes())
);
最后,我能够以正常方式进行索引和查询,无需额外配置,Elasticsearch仅在索引/查询具有上述属性的字段时应用这些分析器。谢谢,但我发现它只能以另一种方式工作-例如,如果文档包含“joe Azing document”查询的是所有格形式“joe's Azing document”(带或不带撇号),然后英国分析者正确地判断出这仍然应该是最匹配的。但是,当文档包含所有格形式“joe's Azing document”时,对“joes…”的查询不匹配。我想我会继续努力的,不管怎样,谢谢。这看起来很奇怪。我想可能是你在词干分析器里碰到了什么奇怪的东西。有一些奇怪的情况,它不能处理完美。您确定您的EnglishAnalyzer也被应用于查询吗?是的,我正在使用完全相同的数据在两个索引上测试各种场景,一个使用每个分析器,然后使用相关分析器在每个索引上运行查询。当查询包含所有格而数据不包含所有格时,我只注意到两组分数和结果顺序之间的差异。对,这种差异在我看来似乎表明分析器不匹配。我想你可能在词干分析器中遇到了一个边缘情况,但是从输出来看,情况似乎不是这样。如果您能展示如何生成查询,这可能会揭示一些东西。我想我已经在这里重新创建了场景: