elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo)
我正在尝试创建一个索引,该索引被配置为忽略重音和pt br stopwords,并允许在高亮度查询中分析多达40mi的字符 我可以使用以下代码创建这样的索引:elasticsearch 如何使用elasticsearch嵌套api创建一个自定义分析器来忽略重音和pt br stopwords? 首先,我认为我使用的是“新闻”类(葡萄牙语中的通知书),它有一个称为“内容”的字符串字段(葡萄牙语中的Conteudo),elasticsearch,kibana,nest,stop-words,accent-insensitive,elasticsearch,Kibana,Nest,Stop Words,Accent Insensitive,我正在尝试创建一个索引,该索引被配置为忽略重音和pt br stopwords,并允许在高亮度查询中分析多达40mi的字符 我可以使用以下代码创建这样的索引: var createIndexResponse = client.Indices.Create(indexName, c => c .Settings(s => s .Setting("highlight.max_analyzed_offset" , 40000000) .Analysi
var createIndexResponse = client.Indices.Create(indexName, c => c
.Settings(s => s
.Setting("highlight.max_analyzed_offset" , 40000000)
.Analysis(analysis => analysis
.TokenFilters(tokenfilters => tokenfilters
.AsciiFolding("folding-accent", ft => ft
)
.Stop("stoping-br", st => st
.StopWords("_brazilian_")
)
)
.Analyzers(analyzers => analyzers
.Custom("folding-analyzer", cc => cc
.Tokenizer("standard")
.Filters("folding-accent", "stoping-br")
)
)
)
)
.Map<Noticia>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Conteudo)
.Analyzer("folding-analyzer")
)
)
)
);
结果:
{
"tokens" : [
{
"token" : "Ferias",
"start_offset" : 0,
"end_offset" : 6,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "funcionarios",
"start_offset" : 19,
"end_offset" : 31,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}
然而,如果我使用NEST ElasticSearch.NET客户端执行搜索,像“Férias”(带重音)和“Ferias”(不带重音)这样的词被视为不同的词
我的目标是执行一个返回所有结果的查询,不管单词是Férias还是Ferias
这就是我用来查询elasticsearch的简化代码(C#nest):
var searchResponse = ElasticClient.Search<Noticia>(s => s
.Index(indexName)
.Query(q => q
.MultiMatch(m => m
.Fields(f => f
.Field(p => p.Titulo,4)
.Field(p => p.Conteudo,2)
)
.Query(termo)
)
)
);
我还尝试在查询中使用多字段和后缀,但没有成功
.Map<Noticia>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Conteudo)
.Analyzer("folding-analyzer")
.Fields(f => f
.Text(ss => ss
.Name("folding")
.Analyzer("folding-analyzer")
)
)
(...)
var searchResponse = ElasticClient.Search<Noticia>(s => s
.Index(indexName)
.Query(q => q
.MultiMatch(m => m
.Fields(f => f
.Field(p => p.Titulo,4)
.Field(p => p.Conteudo.Suffix("folding"),2)
)
.Query(termo)
)
)
);
.Map(mm=>mm
.AutoMap()
.Properties(p=>p
.Text(t=>t
.Name(n=>n.Conteudo)
.分析器(“折叠分析器”)
.Fields(f=>f
.Text(ss=>ss
.名称(“折叠”)
.分析器(“折叠分析器”)
)
)
(...)
var searchResponse=ElasticClient.Search(s=>s
.Index(索引名)
.Query(q=>q
.MultiMatch(m=>m
.Fields(f=>f
.Field(p=>p.Titulo,4)
.Field(p=>p.Conteudo.后缀(“折叠”),2)
)
.查询(termo)
)
)
);
有没有线索表明我做错了什么,或者我能做些什么来达到我的目标
提前多谢!几天后,我发现我做错了什么,这一切都与映射有关 以下是我处理问题并最终解决问题的步骤 1-首先,我打开了kibana控制台,发现只有映射字段的最后一个字段被分配给了我的自定义分析器(折叠分析器) 要测试每个字段,可以使用GET FIELD MAPPING API和开发工具中的命令,如下所示:
GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Field1)
.Analyzer("folding-analyzer")
)
.Text(t => t
.Name(n => n.Field2)
.Analyzer("folding-analyzer")
)
.Object<NoticiaArquivo>(o => o
.Name(n => n.Arquivos)
.Properties(eps => eps
.Text(s => s
.Name(e => e.NAField1)
.Analyzer("folding-analyzer")
)
.Text(s => s
.Name(e => e.NAField2)
.Analyzer("folding-analyzer")
)
)
)
)
)
GET/\u映射/字段/
然后你就可以看到你的分析仪是否被分配到你的领域
2-之后,我发现最后一个字段是唯一分配给我的自定义分析器的字段,原因是我在两个方面搞乱了fluent映射:
- 首先,我必须正确地链接我的文本属性
- 其次,我试图在另一个map子句中映射另一个POCO类,当时我应该使用Object子句
GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Field1)
.Analyzer("folding-analyzer")
)
.Text(t => t
.Name(n => n.Field2)
.Analyzer("folding-analyzer")
)
.Object<NoticiaArquivo>(o => o
.Name(n => n.Arquivos)
.Properties(eps => eps
.Text(s => s
.Name(e => e.NAField1)
.Analyzer("folding-analyzer")
)
.Text(s => s
.Name(e => e.NAField2)
.Analyzer("folding-analyzer")
)
)
)
)
)
.Map(mm=>mm
.AutoMap()
.Properties(p=>p
.Text(t=>t
.Name(n=>n.Field1)
.分析器(“折叠分析器”)
)
.Text(t=>t
.Name(n=>n.Field2)
.分析器(“折叠分析器”)
)
.Object(o=>o
.Name(n=>n.Arquivos)
.Properties(eps=>eps
.Text(s=>s
.Name(e=>e.NAField1)
.分析器(“折叠分析器”)
)
.Text(s=>s
.Name(e=>e.NAField2)
.分析器(“折叠分析器”)
)
)
)
)
)
最后,重要的是,当您使用.Analyzer(“analiserName”)子句分配分析器时,您告诉elastic search您希望将参数分析器用于索引和搜索
如果只想在搜索时而不是索引时使用分析器,则应使用.SearchAnalyzer(“analiserName”)子句
GET /<index>/_mapping/field/<field>
.Map<Noticia>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Field1)
.Analyzer("folding-analyzer")
)
.Text(t => t
.Name(n => n.Field2)
.Analyzer("folding-analyzer")
)
.Object<NoticiaArquivo>(o => o
.Name(n => n.Arquivos)
.Properties(eps => eps
.Text(s => s
.Name(e => e.NAField1)
.Analyzer("folding-analyzer")
)
.Text(s => s
.Name(e => e.NAField2)
.Analyzer("folding-analyzer")
)
)
)
)
)