gpt4 book ai didi

c# - 如何使用 Elasticsearch Nest 在 C# 中动态映射 JObject 的属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:04 24 4
gpt4 key购买 nike

我想使用 Nest 在 C# 中动态映射 JObject 中的属性。目标是将对象的每个字符串字段映射为 SearchAsYouType。我想过 3 种方法,但都行不通:

  1. 使用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但我在Mapping中找不到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.使用访问者强制每个字符串成为 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.Use DynamicTemplates but i can't find SearchAsYouType in the Mapping, it seems that it doesn't exist in Nest 7.4.1 yet

你是对的,看起来 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"
}
}
}
}
}
}
}

Here是GH问题。

希望对您有所帮助。

关于c# - 如何使用 Elasticsearch Nest 在 C# 中动态映射 JObject 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59194687/

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