gpt4 book ai didi

elasticsearch - 如何最好地解决NEST中的索引属性子字段?

转载 作者:行者123 更新时间:2023-12-03 02:04:47 25 4
gpt4 key购买 nike

我正在尝试找出如何最好地使NEST驱动Elastic跨多字段属性的子字段进行搜索,如果可能的话,不对查询中的字段名称进行硬编码。

一些解释...

我们有一个POCO业务对象,其中包含一些字段,因为我们知道它们可能是有些复杂的字母数字字符串,有时带有符号,标点符号和空格,用户很可能无需修饰就可以进行搜索,并且通常以相当不完整的方式进行搜索。

例如,商品代码可能类似于“X123.45-10”,但用户可能只能记住“它以'4510'结尾”。为了找到这些,我们创建了一个带有字符串属性的索引,该属性具有多个字段,每个字段的分析方式都不相同,即使用和不使用非字母字符进行ngrammed:

client.CreateIndex(Elasticsearchindex, c => c
.Analysis(a => a.Analyzers(az1 => az1.Add("ngram_analyzer", ngramAnalyser)))
.Analysis(a => a.Analyzers(az1 => az1.Add("compressedNgramAnalyser", compressedNgramAnalyser)))
.AddMapping<ItemBo>(m => m.MapFromAttributes()
.Properties(props => props
.MultiField(s => s
.Name(p => p.ItemCode)
.Fields(pprops => pprops
.String(ps => ps.Name(p => p.ItemCode).Index(FieldIndexOption.Analyzed).Analyzer("default"))
.String(ps => ps.Name("ngram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("ngram_analyzer"))
.String(ps => ps.Name("compressedNgram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("compressedNgramAnalyser"))
)
)
)
)
);

这给了我们索引属性...
"itemCode": {
"type": "string",
"fields": {
"ngram": {
"type": "string",
"index_analyzer": "ngram_analyzer"
},
"compressedNgram": {
"type": "string",
"index_analyzer": "compressedNgramAnalyser"
}
}
},

最初,我们假设如果将属性包含在查询中,则子字段将被匹配...
sd.Query(q => q.QueryString(qs => qs
.Query(findText)
.OnFields(f => f.Description, f => f.ItemCode)));

...但不会在子字段中查看,而只会显示原始字段。

如果我们想匹配子字段,我们似乎需要从类型化的POCO中脱钩,并显式引用和通配索引字段...
sd.Query(q => q.QueryString(qs => qs
.Query(findText)
.OnFields(new[] {"description", "itemCode.*"}))

我在这里错过了把戏吗?有没有更好的方法来解决NEST查询中的索引属性子字段?

最佳答案

在主字段中搜索不会自动扩展到子字段。您已经发现,您需要使用点表示法来访问它们(itemCode.ngramitemCode.compressedNgram等...)。

NEST提供了一种聪明的方式来处理此问题,同时仍通过Suffix()扩展方法使用表达式:

.OnFields(x => x.ItemCode.Suffix("*"))

序列化时将转换为 itemCode.*

关于elasticsearch - 如何最好地解决NEST中的索引属性子字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com