使用 Nest 处理嵌套对象时遇到问题
Having trouble with Nested-Objects using Nest
当我尝试索引我定义类型的文档时,有一个应该映射为嵌套对象的列表 ("type":"nested"),它被映射为常规对象类型。
看看代码:
我有一个像这样的简单 class:
[ElasticType()]
public class MyJob
{
[ValueFieldAttribute]
public int jobCode { get; set; }
[ValueFieldAttribute(Type = FieldType.nested)]
public IList<JobProfessionalFieldInfo> JobProfessionalFields { get; set; }
}
JobProfessionalFieldInfo class 的代码是:
[ElasticType()]
public class JobProfessionalFieldInfo
{
[ValueFieldAttribute]
public int JobId { get; set; }
[ValueFieldAttribute]
public int CategoryId { get; set; }
}
ValueFieldAttribute class 的代码是:
public class ValueFieldAttribute : ElasticPropertyAttribute
{
public ValueFieldAttribute()
: base()
{
this.Store = false;
this.Index = FieldIndexOption.not_analyzed;
}
}
我的程序:
static void Main(string[] args)
{
ConnectionSettings node = new ConnectionSettings(new Uri("http://localhost:9200"));
node.SetDefaultIndex("jobs");
ElasticClient client = new ElasticClient(node);
List<JobProfessionalFieldInfo> list = new List<JobProfessionalFieldInfo>();
list.Add(new JobProfessionalFieldInfo { CategoryId = 1, JobId = 1 });
list.Add(new JobProfessionalFieldInfo { CategoryId = 2, JobId = 2 });
var res = client.Index<MyJob>(new MyJob
{
jobCode = 1,
JobProfessionalFields = list
},"jobs", "MyJob",1);
}
现在,当我 运行 它时,它成功地为对象建立了索引...但是(!!)当我使用 GET jobs/MyJob/_mapping 获得索引的映射时,我看到 jobProfessionalFields 有其映射中没有 "type":"nested"。
这会导致像下面这样的查询,返回索引的文档,而它不应该取回它(这就是嵌套类型的权利?..):
GET jobs/_search
{
"query":
{
"bool":
{
"must":
[
{"match": {"jobId":1}},
{"match": {"categoryId":2}}
]
}
}
}
还没有结束:
我会看看 here,
回答的人告诉我们,当我们使用注释时,我们需要手动调用 createIndex 和 Map 方法,但问题是我没有任何通用的 Map 方法......!
看看 here:(只是为了让您进入 link - 这是它的开始..)
namespace Nest
{
public partial class ElasticClient...
而且我不知道如何使用非通用 Map 方法来放置我的 MyJob 的映射 class。
我怎样才能使这些东西将 jobProfessionalFields 映射为嵌套类型的家伙?
感谢大家的帮助!
好的,知道了哈哈!
MapFromAttributes<> 是放置映射的正确通用方法(至少在我使用的当前 Nest 版本 - 0.12.0 中)。
但它需要手动调用索引创建,o.w 它给出了一个 IndexMissing 异常(就像上面提到的那个人 link 说的)。
client.CreateIndex("jobs", new IndexSettings { });
var res = client.MapFromAttributes<MyJob>("jobs","MyJob");
但这真的很有趣,为什么仅仅定义
还不够
[ElasticProperty(类型 = FieldType.nested)],
虽然为了获得嵌套映射..
我很乐意得到那个问题的答案。
当我尝试索引我定义类型的文档时,有一个应该映射为嵌套对象的列表 ("type":"nested"),它被映射为常规对象类型。
看看代码:
我有一个像这样的简单 class:
[ElasticType()]
public class MyJob
{
[ValueFieldAttribute]
public int jobCode { get; set; }
[ValueFieldAttribute(Type = FieldType.nested)]
public IList<JobProfessionalFieldInfo> JobProfessionalFields { get; set; }
}
JobProfessionalFieldInfo class 的代码是:
[ElasticType()]
public class JobProfessionalFieldInfo
{
[ValueFieldAttribute]
public int JobId { get; set; }
[ValueFieldAttribute]
public int CategoryId { get; set; }
}
ValueFieldAttribute class 的代码是:
public class ValueFieldAttribute : ElasticPropertyAttribute
{
public ValueFieldAttribute()
: base()
{
this.Store = false;
this.Index = FieldIndexOption.not_analyzed;
}
}
我的程序:
static void Main(string[] args)
{
ConnectionSettings node = new ConnectionSettings(new Uri("http://localhost:9200"));
node.SetDefaultIndex("jobs");
ElasticClient client = new ElasticClient(node);
List<JobProfessionalFieldInfo> list = new List<JobProfessionalFieldInfo>();
list.Add(new JobProfessionalFieldInfo { CategoryId = 1, JobId = 1 });
list.Add(new JobProfessionalFieldInfo { CategoryId = 2, JobId = 2 });
var res = client.Index<MyJob>(new MyJob
{
jobCode = 1,
JobProfessionalFields = list
},"jobs", "MyJob",1);
}
现在,当我 运行 它时,它成功地为对象建立了索引...但是(!!)当我使用 GET jobs/MyJob/_mapping 获得索引的映射时,我看到 jobProfessionalFields 有其映射中没有 "type":"nested"。
这会导致像下面这样的查询,返回索引的文档,而它不应该取回它(这就是嵌套类型的权利?..):
GET jobs/_search
{
"query":
{
"bool":
{
"must":
[
{"match": {"jobId":1}},
{"match": {"categoryId":2}}
]
}
}
}
还没有结束: 我会看看 here, 回答的人告诉我们,当我们使用注释时,我们需要手动调用 createIndex 和 Map 方法,但问题是我没有任何通用的 Map 方法......! 看看 here:(只是为了让您进入 link - 这是它的开始..)
namespace Nest
{
public partial class ElasticClient...
而且我不知道如何使用非通用 Map 方法来放置我的 MyJob 的映射 class。
我怎样才能使这些东西将 jobProfessionalFields 映射为嵌套类型的家伙?
感谢大家的帮助!
好的,知道了哈哈!
MapFromAttributes<> 是放置映射的正确通用方法(至少在我使用的当前 Nest 版本 - 0.12.0 中)。 但它需要手动调用索引创建,o.w 它给出了一个 IndexMissing 异常(就像上面提到的那个人 link 说的)。
client.CreateIndex("jobs", new IndexSettings { });
var res = client.MapFromAttributes<MyJob>("jobs","MyJob");
但这真的很有趣,为什么仅仅定义
还不够[ElasticProperty(类型 = FieldType.nested)],
虽然为了获得嵌套映射..
我很乐意得到那个问题的答案。