Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Elasticsearch with NEST-如何在搜索时忽略标点符号_.net_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,.net,elasticsearch,Nest" /> elasticsearch,nest,.net,elasticsearch,Nest" />

.net Elasticsearch with NEST-如何在搜索时忽略标点符号

.net Elasticsearch with NEST-如何在搜索时忽略标点符号,.net,elasticsearch,nest,.net,elasticsearch,Nest,使用Elasticsearch,我试图用用户提供的字符串查询索引。我的文档包含我希望保留的标点符号,以便在检索时正确显示,但是我不希望该标点符号影响任何搜索结果,无论查询中是否提供了该标点符号。例如: 示例文件: { name: "joe's amazing document" } 当使用标准分析器查询“joe's Azing document”时,这可以正常工作,但是如果用户键入“joes Azing document”这不是一个精确的匹配,文档会在其他低得分匹配中丢失 到目前为止,我一直在

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

示例文件:

{ 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”)
因此,a可能是最好的解决方案。EnglishAnalyzer包括一个EnglishPassessiveFilter,它应该可以处理这种情况

您可以设置英语分析器,如下所示:

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也被应用于查询吗?是的,我正在使用完全相同的数据在两个索引上测试各种场景,一个使用每个分析器,然后使用相关分析器在每个索引上运行查询。当查询包含所有格而数据不包含所有格时,我只注意到两组分数和结果顺序之间的差异。对,这种差异在我看来似乎表明分析器不匹配。我想你可能在词干分析器中遇到了一个边缘情况,但是从输出来看,情况似乎不是这样。如果您能展示如何生成查询,这可能会揭示一些东西。我想我已经在这里重新创建了场景: