NEST 之旅 · 开启
NEST 之旅 · 开启
Version:5.x
英文原文地址:Getting started
说实话,这篇文章翻译的很糟糕。但是我的能力有限,目前只有这个水平,还望各位多指导。
NEST 是 Elasticsearch 的一个高层级的 .NET 客户端,但是它仍然非常接近原始的 Elasticsearch API 。NEST 中所有的请求和响应都是通过类型公开的,这使得它可以快速地启动和运行。
在美丽的外表之下,NEST 有着一个强大的低层级的核心 - Elasticsearch.Net 。有了这个核心,NEST 才得以(向 Elasticsearch 本体服务程序)发送请求和接收响应。这个过程中,NEST 使用和扩展了 Elasticsearch.NET 的许多类型。另外,NEST 公开了这个低级客户端,你可以通过 .LowLevel 属性来访问。
Connecting
连接位于 http://localhost:9200
的本地 Elasticsearch 是非常简单的,你只需要实例化一个客户端的实例即可。
var client = new ElasticClient();
通常情况下,你会需要向客户端传递一些额外的配置选项。比如:你的 Elasticsearch 在远程服务器上运行,那你就需要传递它的具体地址。 ConnectionSettings
参数就是来接收这些配置信息的,有了它你就可以根据不同的配置实例化出相应的客户端。
var settings = new ConnectionSettings(new Uri("http://example.com:9200"))
.DefaultIndex("people");
var client = new ElasticClient(settings);
仔细看上面这个例子,我们设置了一个默认索引。如果请求中没有明确提供其他索引,并且无法从 POCO 泛型参数中推断出索引,就会使用这个默认索引。ConnectionSettings
继承自 ConnnectionConfiguraion
,Elasticsearch.NET (那个低层级的客户端)通过这个对象来接收额外的配置选项。了解更多的配置选项,请访问 Configuration options 。
注意,如果没有配置默认索引,而 NEST 又无法从请求中推断出索引,那它就会抛出一个异常。
ConnectionSettings
没有严格要求只能向 Elasticsearch 传递一个地址。NEST 中还提供了几种不同类型的连接池用来配置客户端。下面的栗子使用了一个 SniffingConnectionPool
,它包含了集群中 3 个 Elasticsearch 节点的地址。客户端将使用这种连接池来维护一个集群中可用节点的列表,这样便可以用循环的方式发送请求。
var uris = new[]
{
new Uri("http://localhost:9200"),
new Uri("http://localhost:9201"),
new Uri("http://localhost:9202"),
};
var connectionPool = new SniffingConnectionPool(uris);
var settings = new ConnectionSettings(connectionPool)
.DefaultIndex("people");
var client = new ElasticClient(settings);
Indexing
将客户端配置好并连接上 Elasticsearch 之后,我们需要往集群里存储一些数据。
假设我们有如下简单传统CLR对象(Plain Old CLR Object)
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
使用同步或者异步的方式索引一个 POCO 实例
var person = new Person
{
Id = 1,
FirstName = "Martijn",
LastName = "Laarman"
};
var indexResponse = client.Index(person); (1)
var asyncIndexResponse = await client.IndexAsync(person); (2)
(1) 同步方法返回一个 IIndexResponse
对象
(2) 异步方法返回一个可等待的 Task<IIndexResponse>
对象
注意:NEST 中所有的方法都提供了同步和异步两种版本,异步方法使用 *Async 后缀命名
上述代码会将文档索引到 /people/person/1
。NEST 很聪明,它会根据 Person 的 CLR 类型来推断 type
,并根据 POCO 的 Id
属性来推断文档的 id
。了解 NEST 中推断文档 id
的其他方式,请参阅 Ids inference 。ConnectionSettings
中配置的默认索引会被用来当作请求的索引名。
警告:NEST 会将 POCO 序列化为 JSON 文档发送给 Elasticsearch。默认情况下,在执行序列化时,NEST 将 POCO 的属性名转换成驼峰式字符串。你可以使用
ConnectionSettings
的.DefaultFieldNameInferrer(Func<string,string>)
方法来改变这一行为。
Searching
我们已经索引了一些文档,接下来就可以开始查询了。
var searchResponse = client.Search<Person>(s => s
.From(0)
.Size(10)
.Query(q => q
.Match(m => m
.Field(f => f.FirstName)
.Query("Martijn")
)
)
);
var people = searchResponse.Documents;
people
变量现在保存着名字里包含 Martijn 的前十个人的文档。这个查询的搜索终端是 /people/person/_search
,其中索引名由 ConnectionSettings
中的默认索引确定,类型名由搜索时传递的泛型参数 Person
确定。
使用 .AllTypes()
可以搜索索引内的全部类型
var searchResponse = client.Search<Person>(s => s
.AllTypes()
.From(0)
.Size(10)
.Query(q => q
.Match(m => m
.Field(f => f.FirstName)
.Query("Martijn")
)
)
);
请求中可以提供单个或者多个索引和类型名,了解更多请分别参阅 Indices paths 和 Document paths 。
到目前为止,所有的搜索示例都使用了 NEST 的 Fluent API ,它使用 lambda 表达式构造结构化的查询,这一点模仿了 Elasticsearch 中的 Query DSL 的查询结构。
NEST 还公开了一个对象初始值设定语法,对于那些不热衷于深层嵌套子表达式的开发者,可以用这种方式来构造查询(布局是关键 ~)
这里有个和之前的栗子相同的查询,不过改成了使用对象初始值设定语法来构造查询
var searchRequest = new SearchRequest<Person>(Nest.Indices.All, Types.All) (1)
{
From = 0,
Size = 10,
Query = new MatchQuery
{
Field = Infer.Field<Person>(f => f.FirstName),
Query = "Martijn"
}
};
var searchResponse = await client.SearchAsync<Person>(searchRequest);
(1) 所有的索引和类型,都在构造函数中指定
笔记:本文开始的时候提到过,高层客户端通过
.LowLevel
属性公开了Elasticsearch.NET
的低层客户端。有些情况下,低层客户端会更合适。例如:你已经有了一个 JSON 对象,想直接发送给服务器,而不希望再把它转换成 Fluent API 或者 Object Initializer 语法。又或者说,高层客户端有一个 bug,让你不得不选择低层客户端。使用低层客户端,可以通过发送字符串或者匿名类型的请求来完成工作。通过
.LowLevel
来使用低层客户端,你可以使用 NEST 中所有的强类型和序列化功能这里有个示例:
var searchResponse = client.LowLevel.Search<SearchResponse<Person>>("people", "person", new
{
from = 0,
size = 10,
query = new
{
match = new
{
field = "firstName",
query = "Martijn"
}
}
}); var responseJson = searchResponse.Body;
可以看到,请求是一个匿名类型,但是响应体是 NEST 返回的响应类型的具体实现。
Aggregations
除了结构化和非结构化的查询,Elasticsearch 还支持聚合数据
var searchResponse = await client.SearchAsync<Person>(s => s
.Size(0)
.Query(q => q
.Match(m => m
.Field(f => f.FirstName)
.Query("Martijn")
)
)
.Aggregations(a => a
.Terms("last_names", ta => ta
.Field(f => f.LastName)
)
)
);
var termsAggregation = searchResponse.Aggs.Terms("last_names");
这个例子里,match
查询搜索出了名字里有 "Martijn" 的人,这和之前的例子是一样的,不同的是:
- 将 size 设为
0
,因为我们不需要查到的前 10 份文档,我们只对聚合结果感兴趣 - 指定了一个
terms
聚合,从而将搜索结果按照姓氏分组
termsAggregation
可以用于获取每个桶的文档数量,其中每个桶的键是姓氏。更多信息,请参阅 Writing aggregations
NEST 之旅 · 开启的更多相关文章
- 开始学java痛苦之旅开启 12-31日 第一章节笔记
1.JDK,Java development kit,开发环境(JDK)2.JRE 是Java运行环境 (Java Runtime Enviroment) 的缩写 我的电脑--属性--工具--文件夹选 ...
- 从一个简单的ASP.NET 5站点开启.NET跨平台之旅
在经历了阿里云上“黑色1秒”的空欢喜之后,我们“被迫”考虑实现.NET的跨平台,将Web服务器由Windows换成Linux.而这种“被迫”在一个存在已久的愿望下,变得水到渠成.这个愿望就是 —— “ ...
- .NET跨平台之旅:corehost 是如何加载 coreclr 的
在前一篇博文中,在好奇心的驱使下,探秘了 dotnet run ,发现了神秘的 corehost —— 运行 .NET Core 应用程序的幕后英雄.有时神秘就是一种诱惑,神秘的 corehost ...
- Mysql DBA 20天速成教程,DBA大纲
Mysql DBA 20天速成教程 基本知识1.mysql的编译安装2.mysql 第3方存储引擎安装配置方法3.mysql 主流存储引擎(MyISAM/innodb/MEMORY)的特点4.字符串编 ...
- Python人工智能第二篇
Python人工智能之路 - 第二篇 : 现成的技术 预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w ...
- Python人工智能之路 - 第二篇 : 算法实在太难了有现成的直接用吧
本节内容 预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w6hk 2.baidu-aip: pip ins ...
- python 全栈开发,Day122(人工智能初识,百度AI)
一.人工智能初识 什么是智能? 我们通常把人成为智慧生物,那么”智慧生物的能力”就是所谓的”智能”我们有什么能力?听,说,看,理解,思考,情感等等 什么是人工智能? 顾名思义就是由人创造的”智慧能力” ...
- flask 简单的语音识别
from aip import AipSpeech,AipNlp #AipNlp 为自然语言处理 """ 你的 APPID AK SK """ ...
- wordpress 使用less 样式无法及时刷新
wordpress 样式无法及时刷新 wordpress编写style样式时,无法及时刷新页面,因此特意记录一番如何处理较好,网友的建议清除Chrome缓存,实时修改style携带的参数 折腾之旅开启 ...
随机推荐
- <TCP/IP>地址解析协议ARP
从前两章中有学到,网络层地址和链路层地址是由不同的,一个是物理地址,一个是IP地址.物理地址固定存储在网卡中,不会改变,而IP地址是可以网络管理员和用户自己分配的 在传统的IPv4网络中,一台A主机要 ...
- AngularJs 刷新页面
第一种: AngularJs 刷新页面可采用下面的方式:首先先在控制器中注册$window,然后定义函数$scope.reloadRoute,在需要刷新页面的地方调用函数$scope.reloadRo ...
- zabbix-3.0.4添加对windows 2008r2的监控
zabbix-3.0.4添加对windows 2008r2的监控 一.windows客户端的配置关闭windows防火墙或者开通10050和10051端口(1).关闭防火墙(不推荐直接关闭,测试可以这 ...
- mysql alter 效率
2017年9月15日 10:36:54 星期五 今天遇到一个效率问题记下来: 场景: mysql要更改一下表字段的注释, 因为sql语句问题, 导致更新了整张表.. 错误: ) UNSIGNED ' ...
- 接口签名进行key排序,并MD5加密
import org.apache.commons.codec.digest.DigestUtils; import java.io.UnsupportedEncodingException; imp ...
- python-函数入门(一)
1.什么是函数: 可重复使用的,用来实现单一,或相关联功能的代码段. 函数分为内置函数和自定义函数,这里先讲自定义函数 2.如何定义函数: #语法 def 函数名(参数1,参数2,参数3,...): ...
- LuoGu P1083 借教室
题目传送门 借教室这个题有两种做法,差分+前缀和或者是线段树 线段树维护区间最小值,因为能不能借教室使用是由这几天中可用教室最少的一天决定的 其实这题是个很裸的线段树维护区间最小值,但有一点需要注意, ...
- Oracle 所有的权限列表
- Confluence 6 使用 Apache 和 mod_proxy 的基本配置
在这些示例中,我们使用下面的信息: http://www.example.com/confluence - 你计划使用的 URL http://example:8090/ - Confluence 当 ...
- python自动化-unittest批量执行用例(discover)
前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...