Elasticsearch Nest 2.x索引嵌套对象

时间:2016-04-15 01:30:20

标签: elasticsearch nest

我是Elasticsearch和Nest的新手,遇到了问题。我想要做的是创建索引并使用嵌套字段索引doc。

    [ElasticsearchType]
public class TestType
{
    [Nest.String(Store = true, Index = FieldIndexOption.Analyzed )]
    public string  Text { get; set; }

    [Nested(IncludeInAll = true)]
    public List<NestedTestType> Nests { get; set; } = new List<NestedTestType>();

    public string Id { get; set; }      
}

[ElasticsearchType]
public class NestedTestType
{
    [Nest.String(Store = true, Index = FieldIndexOption.Analyzed)]
    public string Value { get; set; }

    [Nest.String(Store = false)]
    public string NotStoredValue { get; set; }
}

并且在函数中

            var connectionPool = new Elasticsearch.Net.SniffingConnectionPool(poolUris);
        var settings = new ConnectionSettings(connectionPool);
        client = new ElasticClient(settings);

        string testIndexName = "test";
        var createIndeReponse = client.CreateIndex(testIndexName);
        var mappingResponse = client.Map<TestType>(m => m.Index(testIndexName).AutoMap());
       mappingResponse = client.Map<NestedTestType>(m => m.Index(testIndexName).AutoMap());

        TestType testData = new TestType() { Text = "Hello world" };
        testData.Nests.Add( new NestedTestType() { Value = "In the list", NotStoredValue = "Not stored"} );

        IndexRequest<TestType> indexRequest = new IndexRequest<TestType>(testIndexName, "test_type");
        indexRequest.Document = testData;
        IIndexResponse iir = client.Index(indexRequest);

但是,最后一行中的iir包含错误“对象映射[嵌套]无法从嵌套更改为非嵌套”

我的问题是:

进行索引的正确方法是什么? 我在哪里可以找到有助于我进一步发展的文档?

1 个答案:

答案 0 :(得分:3)

一些观察结果:

  • 将从CLR类型名称推断出TestTypeNestedTestType的类型名称。默认情况下,这些将是类型名称的驼峰式版本,分别为testTypenestedTestType

  • 由于NestedTestTypeTestType上的嵌套类型,因此您无需在索引中为其单独添加映射; NestedTestType的映射是TestType

  • 映射的一部分
  • 您没有为Id的{​​{1}}指定值; NEST will infer the id of the document from the Id property将为空; Elasticsearch可以使用它,并为文档生成唯一的ID,并将其存储在TestType字段中,但不会针对_id中的Id属性设置此唯一ID,这意味着使用NEST约定,通过id检索此文档并不容易。我建议为_source设置一个值,并将字段映射为Id

错误的原因是,在索引not_analyzed时,您将类型名称指定为TestType,而不是明确指定test_type或只是让NEST为您推断它。

当Elasticsearch看到json文档进入时,它不会将它与之前创建的testType映射关联,因为类型名称不匹配(TestType与{{1因此尝试将testType映射为对象。 但是 ,索引确实包含路径test_type下的对象的嵌套映射,这会导致错误。

要解决,我们可以做到

nests

如果您要指定nests应映射为类型名称var connectionPool = new Elasticsearch.Net.SniffingConnectionPool(poolUris); string testIndexName = "test"; var settings = new ConnectionSettings(connectionPool) // specify test to be the default index, meaning if no index name // is explicitly passed to a request or inferred from the type, // this will be the default .DefaultIndex(testIndexName); var client = new ElasticClient(settings); // create the index and add the mapping at the same time var createIndeReponse = client.CreateIndex(testIndexName, c => c .Mappings(m => m .Map<TestType>(mm => mm.AutoMap()) ) ); TestType testData = new TestType { Text = "Hello world", Id = "1" }; testData.Nests.Add(new NestedTestType { Value = "In the list", NotStoredValue = "Not stored" }); IIndexResponse iir = client.Index(testData); ,则可以在连接设置上使用TestType

test_type