我正在使用NEST库与ElasticSearch进行交互,并且试图找到一种基于非类型数据构建索引类型/嵌套对象的方法。该类型具有以下基本结构。
public class Entity : DynamicObject
{
public string Id { get; set; }
// a bunch of other simple properties
public override IEnumerable<string> GetDynamicMemberNames()
{
return Data.Select(x => x.Name);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var dictionary = Data.First(x => x.Name == binder.Name);
result = dictionary;
return true;
}
// each instance of one these should be a nested object type
public IList<NestedType> Data { get; set; }
public class NestedType
{
// How do I make Name be the nest type name?
public string Name { get; set; }
public IDictionary<string, string> Values { get; set; }
}
}
我想为NestedType的每个实例创建一个嵌套的对象/类型。因此,如果有两个NestedType实例,则将有两个嵌套对象。我可以从DynamicObject继承NestedType,将字典变成NEST然后正确映射的“真实”属性(即,将每个字典键变成一个属性)。问题是我不知道如何设置嵌套对象的名称/类型。
我知道有两种方法来映射名称:ElasticType属性和NestedObject流畅接口。这里的问题是,有一个单一类型代表多个嵌套对象类型。我可以进行一些运行时类型构建,但是如果可以避免的话,我宁愿不这样做。
有没有办法将方法或属性用作嵌套对象的名称/类型?还是有更好的方法将此类型的数据映射到ElasticSearch(希望通过NEST)?
谢谢!埃里克
编辑
我更新了实体定义以反映我在做什么(使用DynamicObject使JsonSerializer可以执行我想要的操作)。我想要的是不同词典具有不同映射(不同词干,分析器等)的能力。如果有适当的类型,我可以使用NEST
fluent语法进行设置,但使用动态时,没有类型可供fluent API使用。最终,我想将流畅的API与基于字符串而不是类型的字符串混合。这有意义吗?
如果我正确理解了您的意图,那么Entity
对象中只会嵌套对象,不是吗?
您可以尝试对实体对象使用elasticsearch的动态映射功能。我假设实体是一个根对象。
curl -X POST localhost:9200/myindex/entity/_mapping
{"dynamic_templates": [
{"nested_data_template": {
"mapping": {
"type": "nested" },
"match_mapping_type": "object",
"path_match": "*" }}]}
path_match: *
并match_mapping_type: object
表示将对所有以object作为值的字段名称应用嵌套类型映射。
使用NEST和Fluent API,您可以使用以下API。IntelliSense将指导您如何构建上面的映射。;)
descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>)
每次出现与该模板匹配的新属性时,elasticsearch都会基于动态映射更新映射。一段时间后,您的映射将如下所示:
{
"entity": {
"mappings": {
"entity": {
"dynamic_templates": [
{
"nested_data_template": {
"mapping": {
"type": "nested"
},
"match_mapping_type": "object",
"path_match": "*"
}
}
],
"properties": {
"test": {
"type": "nested",
"properties": {
"test": {
"type": "string"
},
"another_property": {
"type": "string"
}
}
},
"test1": {
"type": "nested",
"properties": {
"test": {
"type": "string"
}
}
}
}
}
}
}
}
希望这会有所帮助!
问题内容: 我有一个这样的文档模型: 一个客户可以有0个,1个或多个订单,一个订单可以有0个,1个或多个orderLines (这是我为这个问题创建的模型,因为我认为这是每个人都可以理解的数据,因此,如果发现任何错误,请让我知道,但不要让他们分散我的实际问题) 我想使用NEST创建一个查询,该查询选择一个(或所有)具有customer.id特定值的客户,但前提是他们至少具有一个具有特定articl
随着ElasticSearch计划删除映射类型,这是否也意味着不再使用嵌套文档和嵌套查询?ElasticSearch将如何支持无类型上下文中的嵌套对象查询? 我正在考虑的功能是能够只返回匹配搜索条件的嵌套数组中的命中。 编辑1:ElasticSearch版本6中的映射查询示例 ElasticSearch 6映射 ElasticSearch 6查询
我想映射这个JSON数据: 对于此java对象: 但是它失败了,所有的值都是。我尝试在变量上方添加,但没有成功。 是否可以反序列化JSON,使其仅映射到(这个)一个类? 编辑:我使用Spring StreamListener进行如下映射:
问题内容: 首先,我正在使用NEST 5.5.0。 我对远程elasticsearch-index有以下用法: 索引中的映射(除了cvrNummer之外没有其他属性)如下: 我还有下面的类,其结果应该映射到: 现在,搜索(searchResponse)保留了预期的结果(1个结果),其中与cvrNummer有关的部分如下所示: 但是,当我查找searchResponse.Documents时,我具有
我正在尝试使用NEST c#客户端搜索我的弹性搜索嵌套对象。我的索引名称是”,我的”字段。 这是我的班级: 现在我的web应用程序看起来像这样: 这里是我需要搜索的单词。 我在浏览器的搜索框(网络表单)中输入它。 搜索关键字可能包含任何需要与我的表人员中的任何字段的值匹配。 如果搜索关键字与嵌套文档匹配,则应返回确切的嵌套文档。 我不知道我的嵌套查询有问题,或者我实际上不知道如何使用嵌套查询来执行
问题内容: 我正在使用Jackson1.9.x。坚持以动物为例,这是我想做的: 假设我有一个Animal类: 我希望能够执行以下操作(将一些子类型映射到一个类,将更多子类型映射到另一个类): 我现在看到的是,杰克逊只会识别“狗到哺乳动物”和“渡渡鸟到鸟”的映射。这是因为StdSubtypeResolver._collectAndResolve()仅允许同一类注册一次(由于NamedType.equ