我们公司(电商)目前使用 elasticsearch。对于一个3亿数据量索引查询速度都是在毫秒级别,不过实现都是基于JAVA的client. 本人因为是.NET出身,虽然现在做JAVA。但是对.NET情有独钟。所以闲暇时间研究了下 elasticsearch的.NET 的CLIENT的NEST.希望.NET人员多使用 elasticsearch 来做搜索服务 解决.NET一直没有好的搜索服务。本人以前也研究过 Lucene.Net。但是无法实现集群及分布式。

本人也参考了很多前辈博客和和本公司做搜索的同事 和 google。走了很多弯路。所以希望后来人别走很多弯路。

Elasticsearch一般至少最少3台服务。2台服务器时候1一台是主分片。另外一台永远都是副本所以在服务,无法实现集群式搜索。只能实现主从备份模式。

所以服务器建议3台以上。这样分片才会平衡到3台服务器上。

参考资料

https://www.nuget.org/packages/Nest

http://blog.csdn.net/huwei2003/article/details/40980929

https://www.elastic.co/guide/en/elasticsearch/client/net-api/1.x/nest.html

安装Elasticsearch

网上已经有很多资料了。所以这里不再写了

1、VS2012安装NEST

PM> Install-Package NEST -version 1.7.2

我安装的是1.7.2的客户端版本。

2、创建连接

 public  static ElasticClient GetElasticClient(string indexName){var connectString = "http://127.0.0.1:9200";var nodesStr = connectString.Split('|');var nodes = nodesStr.Select(s => new Uri(s)).ToList();var connectionPool = new SniffingConnectionPool(nodes);var settings = new ConnectionSettings(connectionPool);if (!string.IsNullOrWhiteSpace(indexName)){settings.SetDefaultIndex(indexName);}var client = new ElasticClient(settings);return client;}

3、创建索引

创建索引只需要调用一次即可。索引结构如下:
[ElasticType(IdProperty = "id", Name = "order")]
public class Order
{[ElasticProperty(Name = "id", Type = FieldType.Long, Index = FieldIndexOption.NotAnalyzed)]public long Id { get; set; }public string Content { get; set; }
[ElasticProperty(Name = "firstname", Type = FieldType.String, Index = FieldIndexOption.Analyzed)]
public string Firstname { get; set; }[ElasticProperty(Name = "lastname", Type = FieldType.String, Index = FieldIndexOption.NotAnalyzed)]
public string Lastname { get; set; }[ElasticProperty(Name = "totalprice", Type = FieldType.Double, Index = FieldIndexOption.NotAnalyzed)]
public Double TotalPrice { get; set; }[ElasticProperty(Name = "createtime", Type = FieldType.Date, Index = FieldIndexOption.Analyzed)]
public DateTime Createtime { get; set; }}

[ElasticType(IdProperty = “id”, Name = “order”)]

这个IdProperty字段属性是搜索在做分片时候需要HASH对象。所以选择这个可以根据数据库的分区键或者数据库主键来选择具体哪个字段来做IdProperty。一般都是选择数据库主键

Content:这个字段未定义属性。 所以这个字段不能拿来做查询条件。

要做查询条件的字段都必须加上

[ElasticProperty(Name = “lastname”, Type = FieldType.String, Index = FieldIndexOption.NotAnalyzed)]
或者

[ElasticProperty(Name = “createtime”, Type = FieldType.Date, Index = FieldIndexOption.Analyzed)]

这两个的区别是
NotAnalyzed 是不分词只做索引字段

Analyzed 作为查询字段并且分词

所以创建索引必须规划好每个字段是否分词及是否查询。

      /// <summary>/// 创建索引/// </summary>/// <param name="indexName"></param>private static void CreateIndex(string indexName){var client = ElasticsearchHelper.GetElasticClient("");//client 不能给 defaultclient.CreateIndex(r => r.Index(indexName).NumberOfReplicas(1).NumberOfShards(20));client.Map<Order>(m => m.MapFromAttributes()); }

这里是创建ORDER的索引并且每个分片一个副本 总共20个分片。

20分片实际要根据业务数据量多少来决定。

4、删除索引

      /// <summary>/// 删除索引/// </summary>private static void DeleteIndex(){var client = ElasticsearchHelper.GetElasticClient("order");var result = client.DeleteIndex(r => r.Index("order"));System.Console.WriteLine(result.IsValid);}

5、写入数据

    private static  void WriteIndex(){var client = ElasticsearchHelper.GetElasticClient("order");long i = GetMax();while (true){i++;SetMax(i);Order order = new Order(){Id = i,Firstname = "我爱天安门",Lastname = "外派",TotalPrice =Convert.ToDouble(i),Content = "天使3412341234" + i.ToString(),Createtime = DateTime.Now};var addResult = client.Index(order);System.Console.WriteLine("第" + i + "行记录" + addResult.Created);}}static long GetMax(){long reslt = 0;try{string k = System.IO.File.ReadAllText("1.txt");reslt = Convert.ToInt64(k);}catch (Exception){}return reslt;}static long SetMax(long max){long reslt = 0;try{System.IO.File.WriteAllText("1.txt", max.ToString());}catch (Exception){}return reslt;}

6、查询

#region 求和
var client = ElasticsearchHelper.GetElasticClient("order");
QueryContainer termQuery = new TermQuery() { Field = "lastname", Value = "求和" };
var result = client.Search<Order>(s => s.Aggregations(a => a.Sum("my_sum_agg", sa => sa.Field(p => p.TotalPrice))));
var agg = result.Aggs.Sum("my_sum_agg");var searchResults = client.Search<Order>(s => s//  .Query(termQuery)  //带筛选条件.Aggregations(r => r.Terms("firstname", r1 => r1.Field(r2 => r2.Lastname).OrderAscending("sumprice").Aggregations(y => y.Sum("sumprice", y1 => y1.Field(y2 => y2.TotalPrice))))));var carTypes = searchResults.Aggs.Terms("firstname");List<double> re=new List<double>();foreach (var carType in carTypes.Items){string key = carType.Key;System.Console.WriteLine("key:" + key + " total:" + carType.Sum("sumprice").Value);re.Add((double)carType.Sum("sumprice").Value);}//List<SumTotalPrice> orders = searchResults.Documents.ToList();//   System.Console.WriteLine(orders.Count() + " total:" + searchResults.Total);//System.Console.WriteLine(searchResults.RequestInformation);System.Console.ReadLine();#endregion#region 多条件精确匹配var client = ElasticsearchHelper.GetElasticClient("order");QueryContainer termQuery = new TermQuery() { Field = "firstname", Value = "测试" };QueryContainer wholeWordQuery = new TermQuery() { Field = "lastname", Value = "addddd" };//非索引字段。无法查询 此查询条件无效QueryContainer termQuery1 = new TermQuery() { Field = "content", Value = "  天空是百度的1696" };termQuery = (termQuery || wholeWordQuery) || termQuery1;var searchResults = client.Search<Order>(s => s.From(0).Size(10).Query(termQuery));List<Order> orders = searchResults.Documents.ToList();System.Console.WriteLine(orders.Count() + " total:" + searchResults.Total);System.Console.ReadLine();#endregion#region 精确匹配var client = ElasticsearchHelper.GetElasticClient("order");var searchResults = client.Search<Order>(s => s.From(0).Size(10).Query(q => q.Term(r => r.OnField(k => k.Firstname).Value("棉花"))).Highlight(h => h.OnFields(e => e.OnField("firstname").PreTags("<b style='color:black'>").PostTags("</b>"))).Sort(r => r.Descending().OnField(q => q.Createtime)));List<Order> orders = searchResults.Documents.ToList();System.Console.WriteLine(orders.Count() + " total:" + searchResults.Total);System.Console.ReadLine();#endregion//  //查询索引字段 带 裤的  类似 数据库的  like '裤%'var client = ElasticsearchHelper.GetElasticClient("order");var searchResults = client.Search<Order>(s => s.From(0).Size(10).QueryString("裤*"));System.Console.WriteLine(" total:" + searchResults.Total);System.Console.ReadLine();#region ID查询var searchResults = client.Search<Order>(s => s.From(0).Size(10).Query(q => q.Ids(r=>r.Values(19))));#endregion#region 时间范围查询var client = ElasticsearchHelper.GetElasticClient("order");//  QueryContainer termQuery = new TermQuery() { Field = "firstname", Value = "测试" };var format = "yyyy-MM-dd'T'HH:mm:ss.fff+08:00";var lowerBound = DateTime.Now.AddMinutes(-20);var searchResults = client.Search<Order>(s => s// .Query(r => termQuery && r.Range(st => st.OnField(st1 => st1.Createtime).GreaterOrEquals(lowerBound, format))).Query(r => r.Range(st => st.OnField(st1 => st1.Createtime).GreaterOrEquals(lowerBound, format))).SortDescending(r=>r.Createtime).From(0).Size(10));List<Order> orders = searchResults.Documents.ToList();var k=  searchResults.RequestInformation;System.Console.WriteLine(orders.Count() + " total:" + searchResults.Total);System.Console.ReadLine();#endregion

7、删除数据

     private static  void DeleteRowById(long id){var client = ElasticsearchHelper.GetElasticClient("order");client.Delete<Order>(r => r.Id(id));}

.NET 分布式 搜索 elasticsearch.net NEST相关推荐

  1. 分布式搜索 Elasticsearch —— 节点实例化

    为什么80%的码农都做不了架构师?>>>    要连接到集群,首先要告诉集群:你是谁,你有什么特征.在 ES 中体现为实例化节点. ES 通过 org.elasticsearch.n ...

  2. 分布式搜索elasticsearch 索引文档的增删改查 入门

    分布式搜索elasticsearch 索引文档的增删改查 入门 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful ...

  3. 分布式搜索elasticsearch搜索功能【深入】

    elasticsearch搜索功能[深入] 分布式搜索elasticsearch搜索功能[深入] 1.数据聚合 1.1 聚合的种类 1.2 DSL实现聚合 1.2.1 Bucket聚合 1.2.2 M ...

  4. 分布式搜索elasticsearch搜索功能【进阶】

    elasticsearch搜索功能 分布式搜索elasticsearch搜索功能 1.DSL查询文档 1.1 DSL查询分类 1.2 全文检索查询 1.3 精准查询 1.4 地理坐标查询 1.5 组合 ...

  5. 黑马程序员--分布式搜索ElasticSearch学习笔记

    写在最前 黑马视频地址:https://www.bilibili.com/video/BV1LQ4y127n4/ 想获得最佳的阅读体验,请移步至我的个人博客 SpringCloud学习笔记 消息队列M ...

  6. 分布式搜索elasticsearch

    为什么80%的码农都做不了架构师?>>>    介绍下es的几个概念: cluster     代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主 ...

  7. 分布式搜索elasticsearch配置文件详解

    2019独角兽企业重金招聘Python工程师标准>>> elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml和logging.yml, ...

  8. 分布式搜索elasticsearch集群监控工具bigdesk

    2019独角兽企业重金招聘Python工程师标准>>> bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索 ...

  9. 怎么配置linux中es搜索的主机名,分布式搜索elasticsearch中文分词集成

    elasticsearch官方只提供smartcn这个中文分词插件,效果不是很好,好在国内有medcl大神(国内最早研究es的人之一)写的两个中文分词插件,一个是ik的,一个是mmseg的,下面分别介 ...

最新文章

  1. 谷歌大脑提出对智能体进行「正向-反向」强化学习训练,加速训练过程
  2. LightOJ 1088 - Points in Segments 二分
  3. ETL工具调度之中美PK
  4. QT绘图控件QWT的安装及配置
  5. 【深度学习】SETR:基于视觉 Transformer 的语义分割模型
  6. 昨天,腾讯百万节点规模管控系统(TSC)诞生了!
  7. 吴恩达发起新型竞赛范式!模型固定,只调数据?!
  8. 前端后台与接口的问题
  9. Java本质论之关于Java栈与堆的思考
  10. 为了车票而奔波着.....
  11. socket.h中定义的函数
  12. html中显示日历的代码,用css+html+javascript实现简单日历的代码
  13. 解决:qrc文件中删除资源文件后编译失败
  14. 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
  15. (7)nodejs学习---之模板引擎jadeejs
  16. 计算机IP地址pin,怎样PIN ip地址
  17. 新蓝天羽网体育用品商店
  18. php必应壁纸 分辨率,Python爬取必应壁纸的代码实例
  19. Android Studio第六课:模仿QQ登录跳转
  20. 【增长黑客读书笔记-范冰】

热门文章

  1. 土建专业计算机软件,计算机应用专业可以评建筑初级职称吗
  2. 读书随想3 - 绝对坦率
  3. 关于ElementUI的CheckBox多选框数据回显
  4. 古今胜景多是妙在天成
  5. Excel VBA 之单元格格式
  6. C++ 十进制点分IP转换为32位二进制IP
  7. [leetcode] 103. Binary Tree Zigzag Level Order Traversal @ python
  8. unity射击游戏的倍镜
  9. 回收站会清理也能恢复不久之前删除的文件
  10. Windows11输入法不显示汉字候选框解决方案