[翻译] 使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

澳门新葡亰网站注册 12

如果您使用过 Apache Lucene
或 Apache Solr,就会知道它们的使用体验非常有趣。尤其在您需要扩展基于
Lucene 或 Solr
的解决方案时,您就会了解 Elasticsearch 项目背后的动机。Elasticsearch(构建于
Lucene
之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。您可以通过标准的
REST
API
或从特定于编程语言的客户端库与 Elasticsearch 进行交互。

原文地址:http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app

本教程将展示 Elasticsearch 的实际工作原理。首先从命令行访问该 REST API
来了解它的基本信息。然后设置一个本地 Elasticsearch
服务器,并从一个简单的 Java
应用程序与它交互。请参见 下载 部分,获取有关的示例代码。

想要轻松地通过许多不同的方式查询数据,甚至是从未预料到的方式?想要以多种方式可视化日志?同时支持基于时间、文本和其他类型的即时过滤器?
借助于 ** Elastic ** stack
的卓越性能和可扩展方式的优点,我们将通过两个示例轻松实现。

前提条件

要理解本教程的所有示例,需要在您的系统上安装
Elasticsearch。下载针对您的平台的 最新 Elastic Search
程序包。将该包解压到一个方便的位置。在
UNIX 或 Linux 上,通过以下命令启动该实例:

/elastic-search-dir/bin/elasticsearch

在 Windows 上,运行

/elastic-search-dir/bin/elasticsearch.bat

在看到日志消息 started 时,该节点已准备好接受请求。

对于 Java
示例,还需要安装 Eclipse 和 Apache
Maven。如果您的系统上还没有它们,请下载和安装它们。

您还需要 cURL。在 Microsoft Windows 上,我使用 Git
Bash shell
来运行 cURL。

本文由 DNC Magazine for Developers and Architects 发布。
从这里下载此杂志
*[PDF] 或
*免费订阅本杂志
下载所有以前和当前的版本版本。

使用 cURL 执行 REST 命令

可以对 Elasticsearch 发出 cURL 请求,这样很容易从命令行 shell
体验该框架。

“Elasticsearch
是无模式的。它可以接受您提供的任何命令,并处理它以供以后查询。”

Elasticsearch
是无模式的,这意味着它可以接受您提供的任何命令,并处理它以供以后查询。Elasticsearch
中的所有内容都被存储为文档,所以您的第一个练习是存储一个包含歌词的文档。首先创建一个索引,它是您的所有文档类型的容器
— 类似于 MySQL
等关系数据库中的数据库。然后,将一个文档插入该索引中,以便可以查询该文档的数据。

在这篇文章中,我将介绍流行的搜索引擎 Elasticsearch,其配套的可视化应用
Kibana,并展示如何对.NET核心可以轻松地与 Elastic stack 整合在一块。

创建一个索引

Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type
其中 REST VERB 是 PUTGET 或 DELETE。(使用
cURL -X 动词前缀来明确指定 HTTP 方法。)

要创建一个索引,可在您的 shell 中运行以下命令:

curl -XPUT "http://localhost:9200/music/"

澳门新葡亰网站注册 1

模式可选

尽管 Elasticsearch 是无模式的,但它在幕后使用了
Lucene,后者使用了模式。不过 Elasticsearch
为您隐藏了这种复杂性。实际上,您可以将 Elasticsearch
文档类型简单地视为子索引或表名称。但是,如果您愿意,可以指定一个模式,所以您可以将它视为一种模式可选的数据存储。

Elasticsearch和.Net Core

插入一个文档

要在 /music 索引下创建一个类型,可插入一个文档。在第一个示例中,您的文档包含数据(包含一行)“Deck
the Halls” 的歌词,这是一首最初由威尔士诗人 John Ceirog Hughes 于 1885
年编写的传统的圣诞歌曲。

要将包含 “Deck the Halls”
的文档插入索引中,可运行以下命令(将该命令和本教程的其他 cURL
命令都键入到一行中):

curl -XPUT "http://localhost:9200/music/songs/1" -d '
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }'

前面的命令使用 PUT 动词将一个文档添加到 /songs 文档类型,并为该文档分配
ID 1。URL 路径显示为 index/doctype/ID

我们将开始探索 Elasticsearch 的 REST API
,通过索引和查询某些数据。接着,我们将使用Elasticsearch官方的 .Net API
完成类似的练习。一旦熟悉 Elasticsearch 及其 API 后,我们将使用 .Net Core
创建一个日志模块,并将数据发送到 Elasticsearch
。Kibana紧随其中,以有趣的方式可视化 Elasticsearch 的索引数据。
我迫切希望你会认为这篇文章十分有趣,并且想要了解更多关于Elastic的强大之处。

查看文档

要查看该文档,可使用简单的 GET 命令:

curl -XGET "http://localhost:9200/music/songs/1"

Elasticsearch 使用您之前 PUT 进索引中的 JSON 内容作为响应:

{"_index":"music","_type":"songs","_id":"1","_version":1,"found":true,"_source":
{ "name": "Deck the Halls", "year": 1885, "lyrics": "Fa la la la la" }}

本文假设您已经了解 C#和 REST API 的基本知识。使用 Visual
Studio,Postman 和 Docker 等工具,但您可以轻松使用 VS Code 和 Fiddler
等替代方案。

更新文档

如果您认识到日期写错了,并想将它更改为 1886
怎么办?可运行以下命令来更新文档:

curl -XPUT "http://localhost:9200/music/lyrics/1" -d '{ "name": 
"Deck the Halls", "year": 1886, "lyrics": "Fa la la la la" }'

因为此命令使用了相同的唯一 ID 1,所以该文档会被更新。

Elasticsearch – 简介#

Elasticsearch
作为核心的部分,是一个具有强大索引功能的文档存储库,并且可以通过 REST
API 来搜索数据。它使用 Java 编写,基于 Apache
Lucene,尽管这些细节隐藏在
API 中。
通过被索引的字段,可以用许多不同的聚合方式找到任何被存储(索引)的文档。
但是,ElasticSearch不仅仅只提供对这些被索引文档的强大搜索功能。
快速、分布式、水平扩展,支持实时文档存储和分析,支持数百台服务器和 PB
级索引数据。同时作为 Elastic stack (aka ELK) 的核心,提供了诸如
LogStash、Kibana 和更多的强大应用。
Kibana 是 Elasticsearch
中专门提供强有力的可视化查询Web应用程序。使用Kibana,能非常简单地为
Elasticsearch 中索引的数据创建查询、图表和仪表盘。
Elasticsearch开放了一个 REST API,你会发现许多文档示例是 HTTP
调用,你可以尝试使用 curl 或 postman 等工具。当然,这个 API
的客户端已经用许多不同的语言编写,包括.Net、Java、Python、Ruby和JavaScript等。
如果你想阅读更多,Elasticsearch
官方网站
可能是最好的地方。

删除文档(但暂时不要删除)

暂时不要删除该文档,知道如何删除它就行了:

curl -XDELETE "http://localhost:9200/music/lyrics/1"

Docker是在本地运行的最简方式#

在这篇文章中,我们需要先连接到一个 Elasticsearch
(和后面的Kibana)的服务器。如果您已经有一个在本地运行或可以使用的服务器,那很好。否则需要先搭建一个服务器。
您可以选择在您的本地机器或可以使用的 VM 或服务器中下载和安装
Elasticsearch 和 Kibana 。不过,建议您使用最简单最纯粹的方式,使用Docker
搭建 Elasticsearch 和 Kibana 。
您可以直接运行以下命令,获取包含Elasticsearch和Kibana的容器。

docker run -it --rm -p 9200:9200 -p 5601:5601 --name esk nshou/elasticsearch-kibana
  • -it 表示以交互模式启动容器,并附加到终端。
  • –rm 表示从终端退出后,容器将被移除。
  • -p 将容器中的端口映射到主机中的端口
  • –name 给容器一个名称,当您不使用的情况下可以用 –rm 手动停止/删除
  • nshou/elasticsearch-kibana 是 Docker
    Hub中的一个镜像的名称,已经有人帮你准备好了Elasticsearch和Kibana
  • 如果你喜欢在后台运行的话,你可以使用参数-d 代替 –it
    –rm,并且手动停止/删除容器。

在同一个容器中运行多个应用程序,就像我们现在这种做法,非常适用本文,但不是推荐用于生产容器!

您应该意识到,一旦你删除容器,你的数据就会消失(一旦你使用-rm选项就删除它了)。虽然有利于本地实验,但在实际环境中,如果您不想丢失数据,请参照
“data container” 模式。

Docker是一个很棒的工具,我鼓励你更多地了解它,特别是如果你想做更重要的事情,而不仅仅是跟随本文,在本地快速搭建
Elasticsearch 服务器。在之前的文章
Building DockNetFiddle using
Docker and .NET
Core

中已经对 .NET Core 搭配 Docker 有很好的介绍。

只需打开
http://localhost:9200

http://localhost:5600
,检查Elasticsearch 和 Kibana 是否都可以使用。(如果您使用docker
toolbox,请使用托管Docker的虚拟机ip替换localhost,您可以在命令行中运行
docker-machine env default )。

澳门新葡亰网站注册 2

在docker中运行 Elasticsearch

澳门新葡亰网站注册 3

kibana也准备好了

从文件插入文档

这是另一个技巧。您可以使用一个文件的内容来从命令行插入文档。尝试此方法,添加另一首针对传统歌曲
“Ballad of Casey Jones” 的文档。将清单 1 复制到一个名为 caseyjones.json
的文件中;也可以使用示例代码包中的 caseyjones.json
文件(参见 下载)。将该文件放在任何方便对它运行
cURL 命令的地方。(在下载的代码中,该文件位于根目录中。)

在 Elasticsearch 中索引和查询

在我们开始编写任何 .Net 代码之前,我们先了解一下一些基本知识。先在
Elasticsearch
索引一些文档(类似于存到数据库),以便我们对它们运行不同的查询。

*在这里,我将使用Postman向我们的 Elasticsearch 服务器发送 HTTP
请求,但您可以使用任何其他类似的工具,如
[Fiddler]()
*curl

我们要做的第一件事是请求 Elasticsearch 创建一个新的索引
(译者语:类似创建一个表) 并索引一些文档 (译者语:类似于在数据中插入数据)
。这类似于将数据存储在表/集合中,主要区别(和目的)是让 Elasticsearch
集群 (这里只是一个节点) 可以分析和搜索文档数据。
被索引的文档在 Elasticsearch
中以索引和类型进行组织。以往,被拿来和数据库表做对比,往往会令人困惑。如这篇文章所述,索引由Lucene处理,在分布式跨
分片 中,与类型紧密地联系在一起。
发送以下两个请求以创建索引,并在该索引中插入文档 (请记住
toolbox,如果使用docker ,请使用托管Docker的虚拟机ip而不是localhost) :

  • 创建一个名为 “default” 的新索引。

PUT localhost:9200/default
  • 在 “default”
    索引中索引文档。请注意,我们需要知道我们存储哪种类型的文档(”product”)和该文档的ID
    (如 1,尽管您可以使用任何值,只要它是唯一的)

PUT localhost:9200/default/product/1
{ 
    "name": "Apple MacBook Pro",
    "description": "Latest MacBook Pro 13",
    "tags": ["laptops", "mac"]
}

澳门新葡亰网站注册 4

创建一个新索引

澳门新葡亰网站注册 5

索引新文档

在我们验证搜索功能和查询数据之前,再索引几个 “product”。尝试使用不同的
“tags”,如 “laptops”和 “laptops”,并记得使用不同的ids!
完成后,让我们按名称排序的搜索所有被索引的文档。您可以使用查询字符串或
GET/POST 同样的内容,下面两个请求是等效的:

GET http://localhost:9200/default/_search?q=*&sort=name.keyword:asc

POST http://localhost:9200/default/_search
{
  "query": { "match_all": {} },
  "sort": [
    { "name.keyword": "asc" }
  ]
}

让我们尝试一些更有趣的东西,例如搜索 “description” 字段中含有 “latest”
,同时 “tags” 字段中含有 “laptops” 的所有文档:

POST http://localhost:9200/default/_search
{
  "query": { 
      "bool": {
      "must": [
        { "match": {"description": "latest"} },
        { "match": { "tags": "laptops" } }
      ]
    }
  },
  "sort": [
    { "name.keyword": "asc" }
  ]
}

澳门新葡亰网站注册 6

搜索结果

清单 1. “Ballad of Casey Jones” 的 JSON 文档
{
  "artist": "Wallace Saunders",
  "year": 1909,
  "styles": ["traditional"],
  "album": "Unknown",
  "name": "Ballad of Casey Jones",
  "lyrics": "Come all you rounders if you want to hear
The story of a brave engineer
Casey Jones was the rounder's name....
Come all you rounders if you want to hear
The story of a brave engineer
Casey Jones was the rounder's name
On the six-eight wheeler, boys, he won his fame
The caller called Casey at half past four
He kissed his wife at the station door
He mounted to the cabin with the orders in his hand
And he took his farewell trip to that promis'd land

Chorus:
Casey Jones--mounted to his cabin
Casey Jones--with his orders in his hand
Casey Jones--mounted to his cabin
And he took his... land"
}

运行以下命令,将此文档 PUT 到您的 music 索引中:

$ curl -XPUT "http://localhost:9200/music/lyrics/2" -d @caseyjones.json

在该索引中时,将清单 2 的内容(包含另一手民歌 “Walking Boss”)保存到
walking.json 文件中。

Kibana 可视化数据

作为介绍的最后部分,我们将对 Kibana 的相关知识蜻蜓点水。
假设您在上一步已经索引了几个文档,通过访问
http://localhost:5601
中打开在 Docker 的 Kibana 服务器。你会注意到,Kibana
要求你提供默认的索引模式,所以必须告诉它使用的 Elasticsearch 索引:

  • 我们在上一节中创建了一个名为 “default” 的索引,因此可以使用
    “default” 作为索引模式。
  • 您还需要取消 “索引包含基于时间的事件 (Index contains time-based
    events ) ” 选项,因为我们的文档不包含任何时间字段。

澳门新葡亰网站注册 7

在 Kibana 中添加索引模式

完成后,使用左侧菜单打开 ” 发现 (Discover) ”
页面,您应该会看到上一节中插入的所有最新文档。尝试选择不同的字段,在搜索栏中输入相关的字段或某个过滤器:

澳门新葡亰网站注册 8

在 kibana 中可视化数据

最后,我们创建一个饼图,显示 “laptops” 或 “desktops”
的销量百分比。利用之前索引的数据,在左侧菜单新建一个 “饼图 (Pie Chart)”

您可以在 饼图 (Pie Chart)的页面上配置。将 ” Count ” 作为切片的大小,并在
” buckets ” 部分中选择 ” split slices ” 。将 ” filters ”
作为聚合类型,添加两个过滤器:tags =”laptop” 和 tags =”desktoptops”
。单击运行,您将看到类似于下图:

澳门新葡亰网站注册 9

在Kibana中创建饼图

确保在搜索栏中输入包含已过滤的项目的搜索关键词,并注意到可视化图形如何变化。

清单 2. “Walking Boss” JSON
{
  "artist": "Clarence Ashley",
  "year": 1920
  "name": "Walking Boss",
  "styles": ["folk","protest"],
  "album": "Traditional",
  "lyrics": "Walkin' boss
Walkin' boss
Walkin' boss
I don't belong to you

I belong
I belong
I belong
To that steel driving crew

Well you work one day
Work one day
Work one day
Then go lay around the shanty two"
}

将此文档推送到索引中:

$ curl -XPUT "http://localhost:9200/music/lyrics/3" -d @walking.json

Elasticsearch .Net API

在简要介绍Elasticsearch和Kibana之后,我们来看看我们如何用 .Net
应用程序索引和查询我们的文档。
您可能想知道为什么要这样做,而不是直接使用 HTTP API
。我可以提供几个理由,我相信你可以自己找几个:

  • 你不想直接暴露 Elasticsearch 集群
  • Elasticsearch
    可能不是您的主数据库,您可能需要结合来自主数据库的结果。
  • 你希望包含来自存储/生产服务器中的被索引文档

首先需要注意的是打开
这个文档
,有两个官方提供的 APIs : Elasticsearch.NetNEST ,都支持 .Net
Core 项目。

  • Elasticsearch.Net 提供了一个用于与
    Elasticsearch连接的低级API,提供构建/处理请求和响应的功能。它是 .Net
    瘦客户端。
  • NEST 在 Elasticsearch.Net 之上,提供了更高级别的 API
    。它可以将对象映射到请求/响应中,提供强大查询功能,将索引名称、文档类型、字段类型用于构建与
    HTTP REST API 的匹配查询。
![](https://upload-images.jianshu.io/upload_images/3913171-0e885efa9cf839fd.png)

Elasticsearch .Net API

由于我使用的是 NEST,所以第一步是创建一个新的 ASP .Net Core
应用程序,并使用 Package Manager 安装NEST。

澳门新葡亰网站注册,搜索 REST API

是时候运行一次基本查询了,此查询比您运行来查找 “Get the Halls”
文档的简单 GET 要复杂一些。文档 URL
有一个内置的 _search 端点用于此用途。在歌词中找到所有包含单词 you 的歌曲:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=lyrics:'you'"

q 参数表示一个查询。

响应是:

{"took":107,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max
_score":0.15625,"hits":[{"_index":"music","_type":"songs","_id":"2","_
score":0.15625,"_source":{"artist": "Wallace Saunders","year": 1909,"styles":
["traditional"],"album": "Unknown","name": "Ballad of Casey Jones","lyrics": "Come all you rounders
if you want to hear The story of a brave engineer Casey Jones was the rounder's name.... Come all
you rounders if you want to hear The story of a brave engineer Casey Jones was the rounder's name
On the six-eight wheeler, boys, he won his fame The caller called Casey at half past four He kissed
his wife at the station door He mounted to the cabin with the orders in his hand And he took his
farewell trip to that promis'd land Chorus: Casey Jones--mounted to his cabin Casey Jones--with his
orders in his hand Casey Jones--mounted to his cabin And he took his... land"
}},{"_index":"music","_type":"songs","_id":"3","_score":0.06780553,"_source":{"artist": "Clarence
Ashley","year": 1920,"name": "Walking Boss","styles": ["folk","protest"],"album":
"Traditional","lyrics": "Walkin' boss Walkin' boss Walkin' boss I don't belong to you I belong I
belong I belong To that steel driving crew Well you work one day Work one day Work one day Then go
lay around the shanty two"}}]}}

使用Nest开始索引数据

我们将在新的 ASP.Net Core 应用程序中完成之前手动发送 HTTP
请求的一些步骤。如果需要,请重新启Docker 容器,从而清理数据;或通过 HTTP
API 和 Postman 手动删除文档/索引。
我们首先为产品创建一个POCO模型:

public class Product
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string[] Tags { get; set; }        
}

接下来,我们创建一个新的控制器 ProductController,它具有添加新的
“Product” 的方法和基于单个关键词查找 “Product” 的方法:

[Route("api/[controller]")]
public class ProductController : Controller
{

    [HttpPost]
    public async Task< IActionResult > Create([FromBody]Product product)
    {
    }

    [HttpGet("find")]
    public async Task< IActionResult > Find(string term)
    {
    }
}

为了实现这些方法,我们需要先连接到 Elasticsearch。这里有一个
ElasticClient 连接的正确示范。
由于该类是线程安全的,所以推荐的方法是在应用程序中使用单例模式,而不是按请求创建新的连接。

为了简洁起见,我现在将使用带有硬编码设置的私有静态变量。在 .Net Core
中使用依赖注入配置框架,或查看
Github中
的代码

可以想到的是,至少需要提供被连接的 Elasticsearch
集群的URL。当然,还有其他可选参数,用于与您的群集进行身份验证、设置超时、连接池等。

private static readonly ConnectionSettings connSettings =
    new ConnectionSettings(new Uri("http://localhost:9200/"));        
private static readonly ElasticClient elasticClient = 
    new ElasticClient(connSettings);

建立连接后,索引文档只是简单地使用 ElasticClient 的Index/IndexAsync
方法:

[Route("api/[controller]")]
public class ProductController : Controller
{

    [HttpPost]
    public async Task<IActionResult> Create([FromBody]Product product)
    {
    }

    [HttpGet("find")]
    public async Task<IActionResult> Find(string term)
    {
    }
}

很简单,对吧?不幸的是,如果您向Postman发送以下请求,您将看到失败。

POST http://localhost:65113/api/product
{ 
    "name": "Dell XPS 13",
    "description": "Latest Dell XPS 13",
    "tags": ["laptops", "windows"]
}

这是因为NEST无法确定在索引文档时使用哪个索引!如果您想起手动使用 HTTP
API 的做法,那么需要在URL指出文档的索引、文档的类型和ID,如
localhost:9200/default/product/1

NEST能够推断文档的类型(使用类的名称),还可以默认对字段进行索引(基于字段的类型),但需要一些索引名称的帮助。您可以指定默认的索引名称,以及特定类型的特定索引名称。

connSettings = new ConnectionSettings(new Uri("http://192.168.99.100:9200/"))
    .DefaultIndex("default")
    //Optionally override the default index for specific types
    .MapDefaultTypeIndices(m => m
        .Add(typeof(Product), "default"));

进行这些更改后再试一次。您将看到 NEST
创建索引(如果尚未存在),并将文档编入索引。如果你切换到
Kibana,你也可以看到该文档。需要注意的是:

  • 从类的名称推断文档类型,如 Product
  • 在类中将Id属性推断为标识
  • 将所有公开的属性发送到 Elasticsearch

澳门新葡亰网站注册 10

使用NEST索引的文档

在我们查询数据之前,重新考虑创建索引的方式。
如何创建索引?
现在我们得到一个事实,即如果这个索引不存在,也会被创建。然而映射字段的索引方式很重要,并直接定义了
Elasticsearch 如何索引和分析这些字段。这对于字符串字段尤其明显,因为在
Elasticsearch v5 中提供了两种不同字段类型的 “Text” 和 “Keyword”:

  • Text 类型的字段将会被分析和分解成单词,以便用于更高级的
    Elasticsearch 搜索功能
  • 另一方面,Keyword 字段将 “保持原样”
    而不进行分析,只能通过其精确值进行搜索。

您可以使用 NEST 索引映射属性来生成POCO模型:

public class Product
{
    public Guid Id { get; set; }
    [Text(Name="name")]
    public string Name { get; set; }
    [Text(Name = "description")]
    public string Description { get; set; }
    [Keyword(Name = "tag")]
    public string[] Tags { get; set; }        
}

然而,我们需要先创建索引,必须使用 ElasticClient API
手动创建和定义索引的映射。这是非常简单的,特别是如果我们只是使用属性:

if (!elasticClient.IndexExists("default").Exists)
{
    elasticClient.CreateIndex("default", i => i
        .Mappings(m => m
            .Map<Product>(ms => ms.AutoMap())));
}

直接向Elasticsearch发送请求(GET
localhost:92000/default),并注意与我们想要的映射是否相同。

澳门新葡亰网站注册 11

使用NEST创建索引映射

使用其他比较符

还有其他各种比较符可供使用。例如,找到所有 1900 年以前编写的歌曲:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:<1900

此查询将返回完整的 “Casey Jones” 和 “Walking Boss” 文档。

使用Nest查询数据

现在,我们有一个使用 NEST 对 “products” 进行索引的 ProductController
控制器。是时候,为这个控制器添加 Find action,用于使用 NEST 向
Elasticsearch 查询文档。
我们只是用到一个字段来实现一个简单的搜索。您应该观察所有字段:

  • 映射为 “Text” 类型的字段可以被分析,您可以在 “name” /
    “description” 字段内搜索特定的单词
  • 映射为 “Keywords” 的字段是保持原样的,未进行分析。您只能在 “tags”
    字段中完全匹配。

NEST 提供了一个查询 Elasticsearch 的丰富 API,可以转换成标准的 HTTP API
。实现上述查询类型与使用Search/SearchAsync方法一样简单,并构建一个
SimpleQueryString 作为参数。

[HttpGet("find")]
public async Task<IActionResult> Find(string term)
{
    var res = await elasticClient.SearchAsync<Product>(x => x
        .Query( q => q.
            SimpleQueryString(qs => qs.Query(term))));
    if (!res.IsValid)
    {
        throw new InvalidOperationException(res.DebugInformation);
    }

    return Json(res.Documents);
}

使用PostMan测试您的新操作:

澳门新葡亰网站注册 12

使用nest查询

正如您可能已经意识到的那样,我们的操作行为与手动发送请求到 Elasticsearch
一样:

GET http://localhost:9200/default/_search?q=*&

限制字段

要限制您在结果中看到的字段,可将 fields 参数添加到您的查询中:

curl -XGET "http://localhost:9200/music/lyrics/_search?q=year:>1900&fields=year"

在 .Net Core 中创建一个Elasticsearch日志提供程序

现在我们了解了 NEST
的一些基础知识,让我们尝试一些更有野心的事情。我们已经创建了一个 ASP.Net
Core 的应用程序,借助.NET
Core的日志框架,实现我们的日志提供程序,并将信息发送到Elasticsearch。
新的日志 API 在日志 (logger) 和日志提供程序 (logger provider)
方面的区别:

  • 日志 (logger) 记录信息和事件,如用于控制器中
  • 可以为应用程序添加并启用多个日志提供程序 (provider)
    ,并可以配置独立的记录级别和记录相应的信息/事件。

该日志框架内置了一些对事件日志、Azure 等的日志提供程序
(provider),但正如您将看到的,创建自己的并不复杂。有关详细信息,请查阅.NET
Core
关于日志的官方文档。
在本文的最后部分,我们将为Elasticsearch创建一个新的日志提供程序,在我们的应用程序中启用它,并使用Kibana来查看记录的事件。