c# - 如何使用 Elasticsearch Nest 在 C# 中动态映射 JObject 的属性
问题描述
我想使用 Nest 在 C# 中动态映射 JObject 中的属性。目标是将对象的每个字符串字段映射为 SearchAsYouType。我想到了 3 种没有用的方法:
- 使用 AutoMap 并直接在 C# 类中声明属性
public class Forfait
{
public long Id { get; set; }
[SearchAsYouType()]
public string Data { get; set; }
}
public class Act
{
public JObject Entity;
}
Forfait forfait = new Forfait()
{
Data = "data",
Id = 99
};
Act act = new Act()
{
Entity = JObject.FromObject(forfait)
};
await client.Indices.CreateAsync("index", o => o
.Map<Act>(m => m
.AutoMap()
2.使用DynamicTemplates但我在映射中找不到SearchAsYouType,它似乎在Nest 7.4.1中不存在
await client.Indices.CreateAsync("index", o => o
.Map<Act>(m => m
.DynamicTemplates(d =>d
.DynamicTemplate("stringassearch",dt => dt
.Match("entity.*")
.MatchMappingType("string")
.Mapping(ma =>ma
.)))));
3.使用Visitor强制每个String都是SearchAsYouType
public class EveryStringIsASearchAsYouTypePropertyVisitor : NoopPropertyVisitor
{
public override IProperty Visit(PropertyInfo propertyInfo, ElasticsearchPropertyAttributeBase attribute)
{
if (propertyInfo.PropertyType == typeof(String))
return new SearchAsYouTypeProperty();
return null;
}
}
await client.Indices.CreateAsync("index", o => o
.Map<Act>(m => m
.AutoMap(new EveryStringIsASearchAsYouTypePropertyVisitor(),2)
一切都失败了
我有一种感觉,解决方案是在 NEST.JsonNetSerializer 中以某种方式使映射中使用的设置适用于 JObject 但我找不到任何有用的东西
解决方案
2.使用DynamicTemplates但我在映射中找不到SearchAsYouType,它似乎在Nest 7.4.1中不存在
你是对的,看起来它从 中丢失了SingleMappingSelector
,但你可以使用这个扩展类轻松解决它,它将添加对search_as_you_type
类型的支持。
static class MappingExtension
{
public static IProperty SearchAsYouType<T>(this SingleMappingSelector<T> mappingSelector,
Func<SearchAsYouTypePropertyDescriptor<T>, ISearchAsYouTypeProperty> selector) where T : class
=> selector?.Invoke(new SearchAsYouTypePropertyDescriptor<T>());
}
然后您可以创建动态模板,如下所示
var createIndexResponse = await client.Indices.CreateAsync("index", o => o
.Map<Act>(m => m
.AutoMap<Act>()
.DynamicTemplates(d => d
.DynamicTemplate("stringassearch", dt => dt
.PathMatch("entity.*")
.MatchMappingType("string")
.Mapping(ma => ma.SearchAsYouType(s => s))))));
请注意,我已更改Match(..)
为PathMatch(..)
- 我认为这就是您所需要的。另外,我不得不将Act
定义更改为
public class Act
{
public object Entity;
}
索引示例文档后,创建了此索引映射
{
"index": {
"mappings": {
"dynamic_templates": [
{
"stringassearch": {
"path_match": "entity.*",
"match_mapping_type": "string",
"mapping": {
"type": "search_as_you_type"
}
}
}
],
"properties": {
"entity": {
"properties": {
"data": {
"type": "search_as_you_type",
"max_shingle_size": 3
},
"id": {
"type": "long"
}
}
}
}
}
}
}
这是GH问题。
希望有帮助。
推荐阅读
- javascript - 创建个人 EventEmitter 类
- apache - 在调度程序中处理 AEM 缓存的最佳方法是什么?
- r - 在 R 中使用 dplyr 对对象内的日期进行排序
- r - 如何在 R 中重新缩放和变换阿拉斯加的美国地图上投影阿拉斯加的空间点
- tensorflow - TensorFlow 没有保存所需的模型
- c - 使用 exec()、fork() 和 pipe() 冻结进程
- javascript - 从 Firebase Vuex 中删除项目
- angular - 访问父路由参数时无法读取 null 的属性“参数”
- excel - excel工作表类型是值类型还是引用类型?
- c - 如何清除 C 中的字符串向量?