使用 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)],

虽然为了获得嵌套映射..

我很乐意得到那个问题的答案。