架构师_程序员

查看: 3580|回复: 24

[资料] 【实战】.net/c# 通过NEST调用elasticsearch搜索[附源码]

[复制链接]
发表于 2018-12-20 17:32:53 | 显示全部楼层
ElasticSearch:

简称ES,是一款基于Lucene的接近实时的搜索平台,它提供了一个分布式的全文搜索引擎,使用RESTful作为API接口,通过简单的Get,Post等操作来对索引和数据进行索引和查询等操作。


必备知识:

【实战】Centos 7 安装部署elasticsearch-6.5.2教程
https://www.itsvse.com/thread-6173-1-1.html
(出处: 架构师_程序员)
【实战】elasticsearch-6.5.2安装elasticsearch-head插件
https://www.itsvse.com/thread-6190-1-1.html
(出处: 架构师_程序员)
【实战】elasticsearch-6.5.2安装elasticsearch-analysis-ik教程
https://www.itsvse.com/thread-6191-1-1.html
(出处: 架构师_程序员)

安装:

NEST可以用过nuget安装,命令如下:

  1. Install-Package NEST -Version 6.4.1
复制代码


.net版本最低要求4.6,详细说明如下:https://github.com/elastic/elasticsearch-net/issues/3334

嗨,我们确实放弃了.netstandard1.3的.NET 4.5支持,net46是新的基线。

我们这样做是为了让我们可以开始介绍netcoreapp2.1 TFM并专注于将所有性能工作带到客户端。

你能告诉我们你的环境吗?

.NET 4.5从2012年开始,到2014年仅有4.5.2从微软支持。 在某些时候,我们需要做出艰难的决定,以便放弃4.5.2,这样我们就可以更专注于当前和更新的.NET版本。 就像我们在几年前放弃.NET 3.5一样,这并非易事。


创建索引:

如果index 不存在 使用如下方式 在创建 index 的 同时 创建 mapping

向接口发送put请求,json数据如下:

  1. {
  2.     "settings": {
  3.         "number_of_shards": 5,
  4.         "number_of_replicas": 0,
  5.         "analysis": {
  6.             "analyzer": {
  7.                 "ik": {
  8.                     "tokenizer": "ik_max_word"
  9.                 }
  10.             }
  11.         }
  12.     },
  13.     "mappings": {
  14.         "News": {
  15.             "properties": {
  16.                 "digest": {
  17.                     "type": "text",
  18.                     "analyzer": "ik_max_word",
  19.                     "search_analyzer": "ik_max_word"
  20.                 },
  21.                 "ncid": {
  22.                     "type": "long"
  23.                 },
  24.                 "ptime": {
  25.                     "type": "date"
  26.                 },
  27.                 "title": {
  28.                     "type": "text",
  29.                     "analyzer": "ik_max_word",
  30.                     "search_analyzer": "ik_max_word"
  31.                 },
  32.                 "url": {
  33.                     "type": "text",
  34.                     "fields": {
  35.                         "keyword": {
  36.                             "type": "keyword",
  37.                             "ignore_above": 256
  38.                         }
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.     }
  44. }
复制代码

返回:

{
"acknowledged": true,
"shards_acknowledged": true,
"index": "test1"
}

如下图:

QQ截图20181220165718.jpg

添加文档:

其实就是添加数据,相当于数据库的行,我采集了一些163的新闻,成功添加,共45条,如下图:

QQ截图20181220170555.jpg

通过elasticsearch-head插件看来查看添加的数据。

QQ截图20181220170837.jpg

手动添加一条带有html代码的数据,put内容如下:

  1. {
  2.   "ncid": 100,
  3.   "title": "testtesttesttesttest<p></p>",
  4.   "digest": "testtesttesttesttest<div><b>aaaa</b></div>",
  5.   "url": "https://www.itsvse.com",
  6.   "ptime": "2018-05-14T00:00:00"
  7. }
复制代码
QQ截图20181220171030.jpg

我们插入一条带有html标签的数据,是为了测试高亮功能,是否把原有的html、js代码进行转义,否则会造成xss攻击等。

搜索:

通过软件搜索“男子”、“test”等关键词,会出现正确的搜索结果,并且显示post的请求内容,方便我们调试,如下:

QQ截图20181220171841.jpg QQ截图20181220171823.jpg

搜索test关键词,发现记录所包含的html代码都被成功转义了!

源码包含新闻txt文件,winform调用elasticsearch源码下载:

游客,如果您要查看本帖隐藏内容请回复





上一篇:初来匝道,服装设计教程分享给大家
下一篇:简单快速的PHP MVC 框架 CodeIgniter
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2018-12-24 11:03:23 | 显示全部楼层
用nest创建索引代码:
  1. var node = new Uri(txturi.Text.Trim());
  2.             var settings = new ConnectionSettings(node);
  3.             settings.DisableDirectStreaming(true); //正式环境要设置成false,否则非常影响性能
  4.             settings.EnableHttpCompression(); //启用gzip压缩请求和响应。您需要在Elasticsearch上配置http压缩才能使用它
  5.             var c = new ElasticClient(settings);
  6.             IIndexState indexState = new IndexState()
  7.             {
  8.                 Settings = new IndexSettings()
  9.                 {
  10.                     NumberOfReplicas = 0,//副本数
  11.                     NumberOfShards = 3//分片数
  12.                 }
  13.             };
  14.             c.CreateIndex("test2", p => p.InitializeUsing(indexState).Mappings(ms => ms
  15.                 .Map<NewsModel>(q => q.AutoMap())));
  16.             MessageBox.Show("ok");
复制代码
模型:

  1. /// <summary>
  2.     /// 映射查阅:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/mapping-types.html
  3.     /// </summary>
  4.     [ElasticsearchType(Name = "News", IdProperty = nameof(Ncid))]
  5.     public class NewsModel
  6.     {
  7.         //[Keyword]
  8.         [Number(NumberType.Long,Name = "ncid")]
  9.         public long Ncid { get; set; }

  10.         [Text(Name = "title",Analyzer = "ik_max_word",SearchAnalyzer = "ik_smart")]
  11.         public string Title { get; set; }

  12.         [Text(Name = "digest",Analyzer = "ik_max_word",SearchAnalyzer = "ik_smart")]
  13.         public string Digest { get; set; }

  14.         [Text(Name = "url",Index = false)] //index参数作用是控制当前字段是否被索引,默认为true,false表示不记录,即不可被搜索。
  15.         public string Url { get; set; }

  16.         [Date(Name = "ptime", Format = "yyyy-MM-dd HH:mm:ss", IgnoreMalformed = true)]
  17.         public DateTime? Ptime { get; set; }
  18.     }
复制代码
查看mapping映射:http://ip:9200/test2/_mapping?pretty

  1. {
  2.   "test2" : {
  3.     "mappings" : {
  4.       "News" : {
  5.         "properties" : {
  6.           "digest" : {
  7.             "type" : "text",
  8.             "analyzer" : "ik_max_word",
  9.             "search_analyzer" : "ik_smart"
  10.           },
  11.           "ncid" : {
  12.             "type" : "long"
  13.           },
  14.           "ptime" : {
  15.             "type" : "date",
  16.             "ignore_malformed" : true,
  17.             "format" : "yyyy-MM-dd HH:mm:ss"
  18.           },
  19.           "title" : {
  20.             "type" : "text",
  21.             "analyzer" : "ik_max_word",
  22.             "search_analyzer" : "ik_smart"
  23.           },
  24.           "url" : {
  25.             "type" : "text",
  26.             "index" : false
  27.           }
  28.         }
  29.       }
  30.     }
  31.   }
  32. }
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-7-22 15:20:56 | 显示全部楼层
1121695511 发表于 2019-7-18 10:27
充了个会员,下载了还是和之前的报一样的错。哎哎。也是查询报错

来纠正一下,程序可以运行,只是跟自己elasticsearch下载的版本不一样导致的
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-7-18 10:27:47 | 显示全部楼层
充了个会员,下载了还是和之前的报一样的错。哎哎。也是查询报错
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-12-21 08:45:31 | 显示全部楼层
不错~ 对我来说,全文搜索是个问题
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-12-21 12:09:32 | 显示全部楼层
谢谢分享,来看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-5-12 17:22:14 | 显示全部楼层
谢谢楼主。。。。是个好人呀
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-5-12 17:35:00 | 显示全部楼层
下不了。。。。哎。要积分。要流量。。各种要
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-5-28 17:53:48 | 显示全部楼层
感谢楼主分享,学习中!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-6-18 18:12:40 | 显示全部楼层
还好,可以试试用用的。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-6-19 17:28:18 | 显示全部楼层
好人一生平安
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2019-6-19 18:07:29 | 显示全部楼层
谢谢分享,来看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-9-29 02:27

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表