搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Elastcisearch.Nest 7.x 系列`伪`官方翻译:通过 NEST 来快捷试用 Elastics

[复制链接]
查看: 35|回复: 0

1万

主题

1万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
45263
发表于 2020-1-24 00:15 | 显示全部楼层 |阅读模式

Elasticsearch.Net 和 NEST 对照说明:

  • Elasticsearch 官方为 .NET 供给了 2 个官方客户端库:Elasticsearch.Net 和 NEST。
  • 可以简单明白为 Elasticsearch.Net 是 NEST 的一个子集。
  • NEST 内部利用了 ElasticSearch.Net ,并经过 NEST 可以对外袒露 ElasticSearch.Net 客户端。
  • 但 NEST 包含了 ElasticSearch.Net 所没有的一些高级功用,如:

    • 强典范查询 DSL:可以将全数请求和响应的工具典范转换 1:1 的.NET 典范。
    • 自动转换为 CLR 的数据典范。

底子上 .NET 项目到了要利用上 ElasticSearch 的境界,间接挑选 NEST 即可。
在利用 NEST 作为客户真个时候,倡议将 ElasticClient 工具作为单例来利用。

  • ElasticClient 被筹划为线程平安。
  • ES 中的缓存是按照 ConnectionSettings来分此外,即办事端缓存针对的是每一个 ConnectionStrings
  • 破例: 当你必要毗连差此外 ES 集群的时候,就不要用单例了,应为差此外 ElasticClient 利用差此外 ConnectionStrings。
快速利用



  • 利用 Nest 的时候约定 Nest 版本必要跟 ElasticSearch 版本连结同等,即办事端 ES版本为 7.3.1,则 Nest 版本也要利用 7.3.1
  • 以下示例经过 IoC 举行注入(单例),你也可以间接经过单例形式来实现。
设备、毗连 ElasticSearch

设备类:
  1. public class ElasticSearchSettings{    public string ServerUri { get; set; }    public string DefaultIndex { get; set; } = "defaultindex";}
复制代码
ElasticSearch 客户端:

  • 毗连到 ElasticSearch,并设定默许索引
  1. public class ElasticSearchClient : IElasticSearchRepository{    private readonly ElasticSearchSettings _esSettings;    private readonly ElasticClient _client;    public ElasticSearchClient(IOptions esSettings)    {        _esSettings = esSettings.Value;        var settings = new ConnectionSettings(new Uri(_esSettings.ServerUri)).DefaultIndex(_esSettings.DefaultIndex);        _client = new ElasticClient(settings);    }    public ElasticSearchClient(ElasticSearchSettings esSettings)    {        _esSettings = esSettings;        var settings = new ConnectionSettings(new Uri(_esSettings.ServerUri)).DefaultIndex(_esSettings.DefaultIndex);        _client = new ElasticClient(settings);    }}
复制代码
毗连设备上利用密码根据

ElasticSearch 可以间接在 Uri 上指定密码,以下:
  1.     var uri = new Uri("http://username:password@localhost:9200")    var settings = new ConnectionConfiguration(uri);
复制代码
利用毗连池

ConnectionSettings 不单支持单地址的毗连方式,一样供给了不同典范的毗连池来让你设备客户端,如利用 SniffingConnectionPool 来毗连集群中的 3 个 Elasticsearch 节点,客户端将利用该典范的毗连池来保护集群中的可用节点列表,并会以循环的方式发送挪用请求。
  1. 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");_client = new ElasticClient(settings);
复制代码
NEST 教程系列 2-1 毗连:Configuration options| 设备选项
索引(Indexing)


  • 这里的“索引”需明白为动词,用 indexing 来明白会更好,表现将一份文档插入到 ES 中。
假定有以下类 User.cs
  1. public class User{    public Guid Id { get; set; }    public string FirstName { get; set; }    public string LastName { get; set; }}
复制代码
索引(Indexing)/增加 一份文档到 ES 中
  1. //同步var response = _client.IndexDocument(new User            {                Id = new Guid("3a351ea1-bfc3-43df-ae12-9c89e22af144"),                FirstName = "f1",                LastName = "l1"            });//异步var response = _client.IndexDocumentAsync(new User            {                Id = new Guid("82f323e3-b5ec-486b-ac88-1bc5e47ec643"),                FirstName = "f2",                LastName = "l2"            });
复制代码

  • 现在供给的方式底子上都含有同步和异步版本(异步方式以 *Async 末端)
  • IndexDocument 方式会判定增加的文档能否已经存在(按照 _id),若存在,则增加失利。
  • NEST 会自动将 Id 属性作为 ES 中的 _id,更多关于 id 的揣度方式见此博文:NEST 教程系列 9-3 转换:Id 揣度

    • 默许情况下,会利用 camel 命名方式举行转换,你可以利用 ConnectionSettings 工具的 .DefaultFieldNameInferrer(Func) 方式来调解默许转换活动,更多关于属性的揣度的见此博文:NEST 教程系列 9-4 转换:Field 属性揣度

终极请求地址为:
  1. PUT  /users/_doc/3a351ea1-bfc3-43df-ae12-9c89e22af144
复制代码
查询

经过类 lambda 表达式举行查询

经过 Search 方式举行查询。
  1. var result = _client.Search(s=>s.From(0)                .Size(10)                .Query(q=>q.Match(m=>m.Field(f=>f.LastName).Query("l1"))));
复制代码
请求 URL 以下:
  1. POST /users/_search?typed_keys=true
复制代码

  • 以上搜索是基于“users”索引来举行搜寻
怎样在 ES 上的全数索引上举行搜索?经过 AllIndices(),以下:
  1. var result = _client.Search(s=>s    .AllIndices()  //指定在全数索引上举行查询    .From(0)    .Size(10)    .Query(q=>q.Match(m=>m.Field(f=>f.LastName).Query("l1"))));
复制代码
假定有以下文档:
  1. //users 索引"hits" : [      {        "_index" : "users",        "_type" : "_doc",        "_id" : "3a351ea1-bfc3-43df-ae12-9c89e22af144",        "_score" : 1.0,        "_source" : {          "id" : "3a351ea1-bfc3-43df-ae12-9c89e22af144",          "firstName" : "f1",          "lastName" : "l1"        }      },      {        "_index" : "users",        "_type" : "_doc",        "_id" : "05245504-053c-431a-984f-23e16d8fbbc9",        "_score" : 1.0,        "_source" : {          "id" : "05245504-053c-431a-984f-23e16d8fbbc9",          "firstName" : "f2",          "lastName" : "l2"        }      }    ]// thirdusers 索引"hits" : [  {    "_index" : "thirdusers",    "_type" : "_doc",    "_id" : "619ad5f8-c918-46ef-82a8-82a724ca5443",    "_score" : 1.0,    "_source" : {      "firstName" : "f1",      "lastName" : "l1"    }  }]
复制代码
则终极可以获得到 users 和 thirdusers 索引中别离获得到 _id 为 3a351ea1-bfc3-43df-ae12-9c89e22af144 和 619ad5f8-c918-46ef-82a8-82a724ca5443 的文档信息。
可以经过 .AllTypes() 和 .AllIndices() 从全数 典范(types) 和 全数 索引(index)中查询数据,终极查询会天生在 /_search 请求中。关于 Type 和 Index,可别离参考:NEST 教程系列 9-6 转换:Document Paths 文档途径跳转:NEST 教程系列 9-7 转换:Indices Paths 索带途径
经过查询工具举行查询

经过 SearchRequest 工具举行查询。
例:在全数索引查询 LastName="l1"的文档信息
  1. var request = new SearchRequest(Nest.Indices.All) //在全数索引上查询{    From = 0,    Size = 10,    Query = new MatchQuery    {        Field = Infer.Field(f => f.LastName),        Query = "l1"    }};var response = _client.Search(request);
复制代码
天生的请求 URL 为:
  1. POST  /_all/_search?typed_keys=true
复制代码
经过 .LowLever 属性来利用 Elasticsearch.Net 来举行查

利用 Elasticsearch.Net 来举行查询的契机:

  • 当客户端存在 bug,即使用上述 NEST 的 Search 和 SearchRequest 很是的时候,可以考虑用 Elasticsearch.Net 供给的查询方式。
  • 当你渴望用一个匿名工具大要 JSON 字符串来举行查询的时候。
  1. var response = _client.LowLevel.Search("users", PostData.Serializable(new{    from = 0,    size = 10,    query = new    {        match = new        {            lastName = "l1"        }    }}));
复制代码
聚合查询

除了结构化和非结构化查询之外, ES 一样支持聚合(Aggregations)查询:
  1. var result = _client.Search(s => s    .Size(0) //设备为 0 ,可以让成果只包含聚合的部分:即 hits 属性中没有成果,聚分解果表现在 ”aggregations“    .Query(q =>        q.Match(m =>            m.Field(f => f.FirstName)                .Query("f2")))    .Aggregations(a => //利用 terms 聚合,并指定到桶 last_name 中        a.Terms("last_name", ta =>            ta.Field(f => f.LastName)))    );
复制代码

  • 一样平常利用 term 聚合来获得每个存储桶的文档数目,其中每个桶将以 lastName 作为关键字。
更多关于聚合的操纵可见此:NEST 教程系列 8 聚合:Writing aggregations | 利用聚合

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表