




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#如何使用ESElasticsearch简介Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的。Elasticsearch是什么Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要发挥其强大的作用,你需使用C#将其集成到你的应用中。Lucene非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。 Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。 不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:分布式的实时文件存储,每个字段都被索引并可被搜索实时分析的分布式搜索引擎可以扩展到上百台服务器,处理PB级结构化或非结构化数据而且,所有的这些功能被集成到一台服务器,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。上手Elasticsearch非常简单,它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。 随着知识的积累,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。以上内容来自 百度百科 关于ES详细概念见:http:/88250./full-text-search-elasticsearch#b3_solo_h3_0 使用C#操作ESNEST是一个高层的客户端,可以映射所有请求和响应对象,拥有一个强类型查询DSL(领域特定语言),并且可以使用.net的特性比如协变、Auto Mapping Of POCOs,NEST内部使用的依然是Elasticsearch.Net客户端。(NEST)客户端提供了强类型查询DSL,方便用户使用,源码下载。一、如何安装NEST打开VS的工具菜单,通过NuGet包管理器控制台,输入以下命令安装NESTInstall-Package NEST安装后引用了以下三个DLLElasticsearch.Net.dll(2.4.4)Nest.dll(2.4.4)Newtonsoft.Json.dll(9.0版本)二、链接elasticsearch你可以通过单个节点或者指定多个节点使用连接池链接到Elasticsearch集群,使用连接池要比单个节点链接到Elasticsearch更有优势,比如支持负载均衡、故障转移等。通过单点链接:1 var node = new Uri(http:/myserver:9200);2 var settings = new ConnectionSettings(node);3 var client = new ElasticClient(settings); 通过连接池链接:复制代码 1 var nodes = new Uri 2 3 new Uri(http:/myserver1:9200), 4 new Uri(http:/myserver2:9200), 5 new Uri(http:/myserver3:9200) 6 ; 7 8 var pool = new StaticConnectionPool(nodes); 9 var settings = new ConnectionSettings(pool);10 var client = new ElasticClient(settings);复制代码 NEST Index为了知道请求需要操作哪个索引,Elasticsearch API期望收到一个或多个索引名称作为请求的一部分。一、指定索引1、可以通过ConnectionSettings使用.DefaultIndex(),来指定默认索引。当一个请求里没有指定具体索引时,NEST将请求默认索引。1 var settings = new ConnectionSettings()2 .DefaultIndex(defaultindex);2、可以通过ConnectionSettings使用.MapDefaultTypeIndices(),来指定被映射为CLR类型的索引。1 var settings = new ConnectionSettings()2 .MapDefaultTypeIndices(m = m3 .Add(typeof(Project), projects)4 ); 注意:通过.MapDefaultTypeIndices()指定索引的优先级要高于通过.DefaultIndex()指定索引,并且更适合简单对象(POCO)3、另外还可以显示的为请求指定索引名称,例如:1 var response = client.Index(student, s=s.Index(db_test);2 var result = client.Search(s = s.Index(db_test);3 var result = client.Delete(null, s = s.Index(db_test);4 注意:当现实的为请求指定索引名称时,这个优先级是最高的,高于以上两种方式指定的索引。4、一些Elasticsearch API(比如query)可以采用一个、多个索引名称或者使用_all特殊标志发送请求,请求NEST上的多个或者所有节点复制代码 1 /请求单一节点 2 var singleString = Nest.Indices.Index(db_studnet); 3 var singleTyped = Nest.Indices.Index(); 4 5 ISearchRequest singleStringRequest = new SearchDescriptor().Index(singleString); 6 ISearchRequest singleTypedRequest = new SearchDescriptor().Index(singleTyped); 7 8 /请求多个节点 9 var manyStrings = Nest.Indices.Index(db_studnet, db_other_student);10 var manyTypes = Nest.Indices.Index().And();11 12 ISearchRequest manyStringRequest = new SearchDescriptor().Index(manyStrings);13 ISearchRequest manyTypedRequest = new SearchDescriptor().Index(manyTypes);14 15 /请求所有节点16 var indicesAll = Nest.Indices.All;17 var allIndices = Nest.Indices.AllIndices;18 19 ISearchRequest indicesAllRequest = new SearchDescriptor().Index(indicesAll);20 ISearchRequest allIndicesRequest = new SearchDescriptor().Index(allIndices);复制代码 二、创建索引Elasticsearch API允许你创建索引的同时对索引进行配置,例如:1 var descriptor = new CreateIndexDescriptor(db_student)2 .Settings(s = s.NumberOfShards(5).NumberOfReplicas(1);3 4 client.CreateIndex(descriptor); 这里指定了该索引的分片数为5、副本数为1。三、删除索引Elasticsearch API允许你删除索引,例如:1 var descriptor = new DeleteIndexDescriptor(db_student).Index(db_student);2 3 client.DeleteIndex(descriptor) 这里制定了要删除的索引名称“db_student”,以下为更多删除用例:1 /删除指定索引所在节点下的所有索引2 var descriptor = new DeleteIndexDescriptor(db_student).AllIndices(); NEST MappingNEST提供了多种映射方法,这里介绍下通过Attribute自定义映射。一、简单实现1、定义业务需要的POCO,并指定需要的Attribute复制代码 1 ElasticsearchType(Name = student) 2 public class Student 3 4 Nest.String(Index = FieldIndexOption.NotAnalyzed) 5 public string Id get; set; 6 7 Nest.String(Analyzer = standard) 8 public string Name get; set; 9 10 Nest.String(Analyzer = standard)11 public string Description get; set; 12 13 public DateTime DateTime get; set; 14 复制代码 2、接着我们通过.AutoMap()来实现映射复制代码1 var descriptor = new CreateIndexDescriptor(db_student)2 .Settings(s = s.NumberOfShards(5).NumberOfReplicas(1)3 .Mappings(ms = ms4 .Map(m = m.AutoMap()5 );6 7 client.CreateIndex(descriptor);复制代码 注意:通过.Properties()可以重写通过Attribute定义的映射二、Attribute介绍1、StringAttribute属性名值类型描述Analyzerstring分析器名称,值包含standard、simple、whitespace、stop、keyward、pattern、language、snowball、custom等,查看分析器更多信息请点击Elasticsearch AnalyzersBoostdouble加权值,值越大得分越高NullValuestring插入文档时,如果数据为NULL时的默认值IndexFieldIndexOption是否使用分析器,默认使用FieldIndexOption.Analyzed,禁止使用分析器FieldIndexOption.NotAnalyzed2、NumberAttribute属性名值类型描述typeNumberType构造函数参数,指定当前属性的类型,NumberType.Default、Float、Double、Integer、Long、Short、ByteBoostdouble加权值,值越大得分越高NullValuedouble插入文档时,如果数据为NULL时的默认值3、BooleanAttribute属性名值类型描述Boostdouble加权值,值越大得分越高NullValuedouble插入文档时,如果数据为NULL时的默认值4、DateAttribute属性名值类型描述Boostdouble加权值,值越大得分越高NullValuestring插入文档时,如果数据为NULL时的默认值Formatstring 5、ObjectAttribute属性名值类型描述typestring/Type构造函数参数,指定当前属性的类型TDynamicDynamicMapping NEST SearchNEST提供了支持Lambda链式query DLS(领域特定语言)方式,以下是简单实现及各个query的简述。一、简单实现1、定义SearchDescriptor,方便项目中复杂业务的实现1 var query = new Nest.SearchDescriptor();2 3 var result = client.Search(x = query)2、检索title和content中包含key,并且作者不等于“俏佳人”的文档复制代码 1 query.Query(q = 2 q.Bool(b = 3 b.Must(m = 4 m.MultiMatch(t = t.Fields(f = f.Field(obj = obj.Title).Field(obj = obj.Content).Query(key) 5 ) 6 .MustNot(m = 7 m.QueryString(t = t.Fields(f = f.Field(obj = obj.Author).Query(wenli) 8 ) 9 )10 );复制代码 注意:如果Elasticsearch使用默认分词,Title和Content的attribute为Nest.String(Analyzer = standard)如果Elasticsearch使用的是IK分词,Title和Content的attribute为Nest.String(Analyzer = ikmaxword)或者Nest.String(Analyzer = ik_smart)Author的attribute为Nest.String(Index = FieldIndexOption.NotAnalyzed),禁止使用分析器3、过滤作者等于“历史小河”的文档query.PostFilter(x = x.Term(t = t.Field(obj = obj.Author).Value(wenli);4、过滤作者等于“历史小河”或者等于“友谊的小船”的文档,匹配多个作者中间用空格隔开1 query.PostFilter(x = x.QueryString(t = t.Fields(f = f.Field(obj = obj.Author).Query(wenli yswenli);5、过滤数量在1100之间的文档1 query.PostFilter(x = x.Range(t = t.Field(obj = obj.Number).GreaterTnOrEquals(1).LessThanOrEquals(100); 6、排序,按照得分倒叙排列1 query.Sort(x = x.Field(_score, Nest.SortOrder.Descending); 7、定义高亮样式及字段复制代码1 query.Highlight(h = h2 .PreTags()3 .PostTags()4 .Fields(5 f = f.Field(obj = obj.Title),6 f = f.Field(obj = obj.Content),7 f = f.Field(_all)8 )9 );复制代码 8、拼装查询内容,整理数据,方便前段调用复制代码 1 var list = result.Hits.Select(c = new Models.ESObject() 2 3 Id = c.Source.Id, 4 Title = c.Highlights = null ? c.Source.Title : c.Highlights.Keys.Contains(title) ? string.Join(, c.Highlightstitle.Highlights) : c.Source.Title, /高亮显示的内容,一条记录中出现了几次 5 Content = c.Highlights = null ? c.Source.Content : c.Highlights.Keys.Contains(content) ? string.Join(, c.Highlightscontent.Highlights) : c.Source.Content, /高亮显示的内容,一条记录中出现了几次 6 Author = c.Source.Author, 7 Number = c.Source.Number, 8 IsDisplay = c.Source.IsDisplay, 9 Tags = c.Source.Tags,10 Comments = c.Source.Comments,11 DateTime = c.Source.DateTime,12 )复制代码 二、query DSL介绍待整理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 30312-2025浸胶纱线、线绳和帘线热收缩试验方法
- 汉字的形体演变探析
- 社区活动开幕词范本
- 财务科技对传统银行的影响研究
- 金融科技在普惠金融中的应用探讨
- 成功源于勤奋演讲稿
- DB52T 453.6-2004 地产中药材有害生物无害化治理技术规程 玄参
- 军事理论-综合版知到智慧树见面课答案
- 水龙吟苏轼课件
- Ubuntu Linux 22.04系统管理与服务器配置 课件 项目3 软件包管理
- 缺血性心肌病病人护理查房
- 《社保新政策解》课件
- 《基于UG的汽车机加件工时计算及系统开发》
- 房产代理转让合同范例
- GB/T 7247.1-2024激光产品的安全第1部分:设备分类和要求
- 2023银行首届夏日音乐会系列(天籁之音乐动一夏主题)活动策划方案-106正式版
- 校服供货服务方案
- 呼吸机断电的应急演练
- 玉兰花的栽培与管理方法
- 早期子宫内膜癌患者保留生育功能治疗专家共识
- (完整)中医症候积分量表
评论
0/150
提交评论