【问题标题】:Automapping document into elasticsearch is not working using NEST使用 NEST 将文档自动映射到弹性搜索中不起作用
【发布时间】:2019-04-30 05:58:22
【问题描述】:

我有一个简单的 C# 虚拟文档。我第一次尝试使用 NEST 客户端将它索引到 elasticsearch 中。但是自动映射不起作用。

我的虚拟文档是:

class DummyRecord {
    public string RecordName;
    public int RecordId;
}

而主程序是:

class Program
{
    static void Main(string[] args)
    {
        var node = new Uri("http://localhost:9200");
        var settings = new ConnectionSettings(node).DefaultTypeName("_doc");
        var client = new ElasticClient(settings);

        var doc = new DummyRecord {
            RecordName = "SOmething",
            RecordId = 1
        };
            
        var creaeIndexRespone = client.CreateIndex("DummyIndex",c => c.Mappings(ms=> ms.Map<DummyRecord>(m => m.AutoMap())));
        Console.WriteLine(creaeIndexRespone);
            
        var response = client.Index(doc, idx => idx.Index("DummyIndex"));
        Console.WriteLine(response);
        Console.ReadKey();
    }
}

我得到的只是以下输出:

通过对 PUT 的不成功低级别调用构建的无效 NEST 响应:/DummyIndex

通过对 POST 的不成功低级调用构建的无效 NEST 响应:/DummyIndex/_doc

如何让这个东西工作。在创建设置时我还有什么需要做的吗??

var settings = new ConnectionSettings(node).DefaultTypeName("_doc");

【问题讨论】:

  • 为什么要映射数据?你只需要传递你的模型
  • 最初 ElasticSearch 不包含映射。所以如果你试图索引一个文档,ElasticSearch 会拒绝。
  • @AdityaNadig 默认情况下,Elasticsearch 将允许您将文档索引到不存在的索引中,并将 (a) 创建索引并 (b) 从索引的第一个文档推断映射。您可以关闭自动索引创建和更改推断映射,但默认情况下都启用。在搜索用例和其他您知道如何搜索文档的情况下,定义显式映射很有用

标签: c# elasticsearch nest


【解决方案1】:

两件事

  1. 索引名称需要小写,即"DummyIndex" -> "dummyindex"
  2. DummyRecord 成员需要是属性而不是字段

您可以检查对任何 API 调用的响应是否有效,并在需要时采取措施

var client = new ElasticClient();

var createIndexResponse = client.CreateIndex(defaultIndex, c => c
    .Mappings(m => m
        .Map<DummyRecord>(mm => mm
            .AutoMap()
        )
    )
);

if (!createIndexResponse.IsValid) {
    Console.WriteLine(createIndexResponse.DebugInformation);
}

【讨论】:

    【解决方案2】:

    启动您的最终模型,然后将该模型传递给 elastic 以对其进行索引。

    根据 Elastic 的文档,您可以像这样索引您的数据。

        var person = new Person
    {
        Id = 1,
        FirstName = "Martijn",
        LastName = "Laarman"
    };
    
    var indexResponse = client.IndexDocument(person); 
    

    更新:Index() vs IndexDocument

    IndexDocument() 用于简单地索引单个文档。

    Index()如果你需要设置额外的参数,你可以使用这个方法。

    查看 Elastic 文档

    【讨论】:

    • client.Index() 和 client.IndexDocument() 有什么区别??
    • @AdityaNadig 更新
    • 非常感谢奥斯曼。但是,最初创建索引和映射是必需的。并且与此上下文相关的 Index() 和 IndexDocument() 之间没有太大区别。
    • @AdityaNadig 是的,我很困惑。你想create an index 而不是index a document。我明白了:)
    猜你喜欢
    • 2013-03-20
    • 2015-07-21
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多