使用Nest时遇到嵌套对象的问题

时间:2015-01-15 20:21:24

标签: dictionary elasticsearch nest

当我尝试索引我定义类型的文档时,有一个应该被映射为嵌套对象的列表("类型":"嵌套"),它& #39;被映射为常规对象类型。

看看代码:

我有一个像这样的简单课程:

[ElasticType()]
public class MyJob
{
    [ValueFieldAttribute]
    public int jobCode { get; set; }

    [ValueFieldAttribute(Type = FieldType.nested)]
    public IList<JobProfessionalFieldInfo> JobProfessionalFields { get; set; }
}

JobProfessionalFieldInfo类的代码是:

[ElasticType()]
public class JobProfessionalFieldInfo
{
    [ValueFieldAttribute]
    public int JobId { get; set; }

    [ValueFieldAttribute]
    public int CategoryId { get; set; }
}

ValueFieldAttribute类的代码是:

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没有&#34;类型& #34;:&#34;嵌套&#34;在其映射中。

这导致了一个类似下面的查询,返回索引的文档而它不应该得到它(那是什么嵌套类型是对的?):

GET jobs/_search
{
    "query": 
    {
        "bool": 
        {
            "must": 
            [
               {"match": {"jobId":1}},
               {"match": {"categoryId":2}}               
            ]
        }
    }    
}

不是结束: 我看一下here, 有回答的人告诉我们,当我们使用注释时,我们需要手动调用createIndex和Map方法,但问题是我没有任何通用的Map方法......! 看看here :(只是为了让你进入链接 - 这里是它的开始..)

namespace Nest
{
    public partial class ElasticClient...

而且我不知道如何使用非通用Map方法来放置MyJob类的映射。

如何让这些东西将jobProfessionalFields映射为嵌套类型的家伙?

感谢你们的帮助!

1 个答案:

答案 0 :(得分:0)

好的,明白了!

MapFromAttributes&lt;&gt;是用于放置映射的正确通用方法(至少在当前的Nest版本I&#39; m中使用 - 0.12.0)。 但是它需要手动调用索引创建,o.w它给出了一个IndexMissing异常(就像上面提到的链接中所说的那样)。

        client.CreateIndex("jobs", new IndexSettings { });
        var res = client.MapFromAttributes<MyJob>("jobs","MyJob");

但这真的很有趣,为什么还不足以定义

[ElasticProperty(Type = FieldType.nested)],

以获取嵌套映射..

我很乐意为那个答案得到答案。