不为失败找理由,要为成功找方法。

NEST客户端 实现近义词匹配,用自定义分析器,映射到字段提示分析器不存在

Elasticsearch | 作者 gouhan | 发布于2017年10月12日 | 阅读数:3891

NEST版本:2.4.1
ES版本:2.4.1
 
1 C# 自定义分析器和映射字段的代码如下:
var descriptor = new CreateIndexDescriptor(DefaultIndex)
.Settings(s => s
.Analysis(a => a
.TokenFilters(tf => tf
.Synonym("my_synonym_filter", stf => stf
.SynonymsPath("analysis/synonym.txt")
.Tokenizer("whitespace")
)
)
.Analyzers(an => an.Custom("myik_syno", ca => ca
.Tokenizer("ik")
.Filters("my_synonym_filter")
)
)
.Analyzers(an => an.Custom("myik_smart_syno", ca => ca
.Tokenizer("ik_smart")
.Filters("my_synonym_filter")
)
)
)
)
.Mappings(m => m.Map<MpMappingInfo>(tm => tm.AutoMap()
.Properties(ps => ps
.Number(p => p.Name(n => n.Id))
.Number(p => p.Name(n => n.MPType))
.Boolean(p => p.Name(n => n.NeedPay))
.Number(p => p.Name(n => n.UserId))
.String(p => p.Name(n => n.TrueName).Analyzer("ik"))
.String(p => p.Name(n => n.ImageUrl).NotAnalyzed())
.String(p => p.Name(n => n.Organization).Analyzer("ik"))
.String(p => p.Name(n => n.Introduction).Analyzer("myik_syno"))
.Number(p => p.Name(n => n.ChannelId))
.String(p => p.Name(n => n.DeptName).Analyzer("ik"))
.String(p => p.Name(n => n.PositionalTitle).NotAnalyzed())
.String(p => p.Name(n => n.Description).Analyzer("myik_syno"))
.String(p => p.Name(n => n.ChannelIdList).NotAnalyzed())
.String(p => p.Name(n => n.ChannelNameList).Analyzer("myik_syno"))
.Date(p => p.Name(n => n.CreateTime))
.GeoPoint(p => p.Name(n => n.Location).LatLon(true))
)
)
);
var indexResponse = config.Client.CreateIndex(descriptor);

2 在ES的config目录下创建了analysis\synonym.txt文件.
在执行生成索引的时候,提示错误日志:
MapperParsingException[Failed to parse mapping [mp]: analyzer [myik_syno] not found for field [description]]; nested: MapperParsingException[analyzer [myik_syno] not found for field [description]];
已邀请:

gouhan

赞同来自: medcl

该错误已经找到原因,由于在定义分析器的时候,调用了两次Analyzers,后面的一次就覆盖了之前的一次定义.
要定义多个,需要在Analyzers里面,通过Custom多次定义

kennywu76 - Wood

赞同来自:

.net完全不会, 不清楚哪里的问题。 报错看,就是myik_syno这个自定义的analyzer找不到。  可以GET /<index>/ ,将生成的settings和mappings倒出来看一下,看analysis是否正确的在settings里生成了,mappings里是否正确应用了。   错误日志也要看一下是否有更深的错误栈,也许是其他异常导致了settings没有正确设置。

要回复问题请先登录注册