使用Elasticsearch NEST C#索引Json文档

5 c# json elasticsearch nest

我是Elasticsearch的新手,想要了解如何使用NEST C#在Elasticsearch上创建索引和索引之后的索引和索引?

{
    "BookName": "Book1",
    "ISBN": "978-3-16-148410-0",
    "chapter" : [
        {
            "chapter_name": "Chapter1",
            "chapter_desc": "Before getting into computer programming, let us first understand computer programs and what they..."
        },
        {
            "chapter_name": "Chapter2",
            "chapter_desc": "Today computer programs are being used in almost every field, household, agriculture, medical, entertainment, defense.."
        },
        {
            "chapter_name": "Chapter3",
            "chapter_desc": "MS Word, MS Excel, Adobe Photoshop, Internet Explorer, Chrome, etc., are..."
        },
        {
            "chapter_name": "Chapter4",
            "chapter_desc": "Computer programs are being used to develop graphics and special effects in movie..."
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

Rus*_*Cam 6

使用NEST创建索引非常简单

var client = new ElasticClient();
client.CreateIndex("index-name");
Run Code Online (Sandbox Code Playgroud)

这将创建一个索引,其中包含为节点定义的默认分片数和副本数.

将表示为json的文档索引到索引中

var json = @"{
    ""BookName"": ""Book1"",
    ""ISBN"": ""978-3-16-148410-0"",
    ""chapter"" : [
        {
            ""chapter_name"": ""Chapter1"",
            ""chapter_desc"": ""Before getting into computer programming, let us first understand computer programs and what they...""
        },
        {
    ""chapter_name"": ""Chapter2"",
            ""chapter_desc"": ""Today computer programs are being used in almost every field, household, agriculture, medical, entertainment, defense..""
        },
        {
    ""chapter_name"": ""Chapter3"",
            ""chapter_desc"": ""MS Word, MS Excel, Adobe Photoshop, Internet Explorer, Chrome, etc., are...""
        },
        {
    ""chapter_name"": ""Chapter4"",
            ""chapter_desc"": ""Computer programs are being used to develop graphics and special effects in movie...""
        }
    ]
}";

var indexResponse = client.LowLevel.Index<string>("index-name", "type-name", json);

if (!indexResponse.Success)
    Console.WriteLine(indexResponse.DebugInformation);
Run Code Online (Sandbox Code Playgroud)

这里我们使用低级客户端索引json,通过.LowLevel属性在NEST中可用ElasticClient.

要搜索索引文档

// refresh the index so that newly indexed documents are available
// for search without waiting for the refresh interval
client.Refresh("index-name");

var searchResponse = client.Search<dynamic>(s => s
    .Index("index-name")
    .Type("type-name")
    .Query(q => q
        .Match(m => m
            .Query("Photoshop")
            .Field("chapter.chapter_desc")
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

这将返回索引的文档.此处dynamic使用的泛型类型参数Search<T>()表示生成的文档将反序列化为Json.Net JObject类型.

当我们创建索引时,我们没有为我们的类型指定映射type-name,因此Elasticsearch从json文档的结构推断出映射.这是动态映射,对于许多情况都很有用,但是,如果您知道要发送的文档的结构并且不会破坏性地更改它,那么您可以为该类型指定映射.在这个特定示例中执行此操作的优点是,chapter数组将被推断为object类型映射,但如果您想要搜索单个章节的章节名称和章节描述,那么您可能希望将其映射chapternested类型.

  • 嘿@Steve,自从这个答案以来,客户已经发生了一些变化。看看 https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/elasticsearch-net-getting-started.html#_searching 和 https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/elasticsearch-net-getting-started.html#_searching 和 https:// /www.elastic.co/guide/en/elasticsearch/client/net-api/current/nest-getting-started.html#_searching_2。具体来说,响应类型现在是“StringResponse”,并且不支持文档类型的“_type”参数 (2认同)