﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-青蛙學堂-随笔分类-Elasticsearch</title><link>http://www.cnitblog.com/yide/category/8980.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 27 Aug 2022 03:38:13 GMT</lastBuildDate><pubDate>Sat, 27 Aug 2022 03:38:13 GMT</pubDate><ttl>60</ttl><item><title>Elasticsearch简介</title><link>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 26 Aug 2022 06:18:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/96043.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/08/26/96043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/96043.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/96043.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Elasticsearch简介<br /><br />Elasticsearch&nbsp;（ES）是一个基于Apache&nbsp;Lucene&#8482;的开源搜索引擎，无论在开源还是专有领域，Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。<br /><br />但是，Lucene只是一个库。想要发挥其强大的作用，你需使用C#将其集成到你的应用中。Lucene非常复杂，你需要深入的了解检索相关知识来理解它是如何工作的。<br /><br />Elasticsearch是使用Java编写并使用Lucene来建立索引并实现搜索功能，但是它的目的是通过简单连贯的RESTful&nbsp;API让全文搜索变得简单并隐藏Lucene的复杂性。<br /><br />不过，Elasticsearch不仅仅是Lucene和全文搜索引擎，它还提供：<br /><br />分布式的实时文件存储，每个字段都被索引并可被搜索<br /><br />实时分析的分布式搜索引擎<br /><br />可以扩展到上百台服务器，处理PB级结构化或非结构化数据<br /><br />而且，所有的这些功能被集成到一台服务器，你的应用可以通过简单的RESTful&nbsp;API、各种语言的客户端甚至命令行与之交互。<br /><br />上手Elasticsearch非常简单，它提供了许多合理的缺省值，并对初学者隐藏了复杂的搜索引擎理论。它开箱即用（安装即可使用），只需很少的学习既可在生产环境中使用。Elasticsearch在Apache&nbsp;2&nbsp;license下许可使用，可以免费下载、使用和修改。<br /><br />随着知识的积累，你可以根据不同的问题领域定制Elasticsearch的高级特性，这一切都是可配置的，并且配置非常灵活。<br /><br /><span style="color: #008000; "><br /></span><br />使用C#操作ES<br /><br />NEST是一个高层的客户端，可以映射所有请求和响应对象，拥有一个强类型查询DSL（领域特定语言），并且可以使用.net的特性比如协变、Auto&nbsp;Mapping&nbsp;Of&nbsp;POCOs，NEST内部使用的依然是Elasticsearch.Net客户端。<br /><br />Elasticsearch.net（NEST）客户端提供了强类型查询DSL，方便用户使用，源码下载。（https:<span style="color: #008000; ">//</span><span style="color: #008000; ">github.com/elastic/elasticsearch-net/releases/tag/2.4.4）</span><span style="color: #008000; "><br /></span><br />一、如何安装NEST<br /><br />打开VS的工具菜单，通过NuGet包管理器控制台，输入以下命令安装NEST<br /><br />Install-Package&nbsp;NEST<br /><br />安装后引用了以下三个DLL<br /><br />Elasticsearch.Net.dll（2.4.4）<br /><br />Nest.dll（2.4.4）<br /><br />Newtonsoft.Json.dll（9.0版本）<br /><br />二、链接elasticsearch<br /><br />你可以通过单个节点或者指定多个节点使用连接池链接到Elasticsearch集群，使用连接池要比单个节点链接到Elasticsearch更有优势，比如支持负载均衡、故障转移等。<br /><br />通过单点链接：<br /><br />var&nbsp;node&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri(&#8220;http:<span style="color: #008000; ">//</span><span style="color: #008000; ">myserver:9200&#8221;);</span><span style="color: #008000; "><br /></span><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(node);<br /><br />var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />通过连接池链接：<br /><br />var&nbsp;nodes&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Uri[]<br /><br />{<br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver1:9200"),<br /><br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver2:9200"),<br /><br /><span style="color: #0000FF; ">new</span>&nbsp;Uri("http://myserver3:9200")<br />};<br /><br />var&nbsp;pool&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StaticConnectionPool(nodes);<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(pool);<br /><br />var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />NEST&nbsp;Index<br /><br />为了知道请求需要操作哪个索引，Elasticsearch&nbsp;API期望收到一个或多个索引名称作为请求的一部分。<br /><br />一、指定索引<br /><br />1、可以通过ConnectionSettings使用.DefaultIndex()，来指定默认索引。当一个请求里没有指定具体索引时，NEST将请求默认索引。<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings()<br /><br />.DefaultIndex("defaultindex");<br />2、可以通过ConnectionSettings使用.MapDefaultTypeIndices()，来指定被映射为CLR类型的索引。<br /><br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings()<br /><br />.MapDefaultTypeIndices(m&nbsp;=&gt;&nbsp;m<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.Add(<span style="color: #0000FF; ">typeof</span>(Project),&nbsp;"projects")<br /><br />);<br />注意：通过.MapDefaultTypeIndices()指定索引的优先级要高于通过.DefaultIndex()指定索引，并且更适合简单对象（POCO）<br /><br />3、另外还可以显示的为请求指定索引名称，例如：<br /><br />var&nbsp;response&nbsp;=&nbsp;client.Index(student,&nbsp;s=&gt;s.Index(&#8220;db_test&#8221;));<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Search(s&nbsp;=&gt;&nbsp;s.Index(&#8220;db_test&#8221;));<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Delete(<span style="color: #0000FF; ">null</span>,&nbsp;s&nbsp;=&gt;&nbsp;s.Index(&#8220;db_test&#8221;));<br /><br />&#8230;&#8230;<br /><br />注意：当现实的为请求指定索引名称时，这个优先级是最高的，高于以上两种方式指定的索引。<br /><br />4、一些Elasticsearch&nbsp;API（比如query）可以采用一个、多个索引名称或者使用_all特殊标志发送请求，请求NEST上的多个或者所有节点<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求单一节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;singleString&nbsp;=&nbsp;Nest.Indices.Index(&#8220;db_studnet&#8221;);<br /><br />var&nbsp;singleTyped&nbsp;=&nbsp;Nest.Indices.Index();<br /><br />ISearchRequest&nbsp;singleStringRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(singleString);<br /><br />ISearchRequest&nbsp;singleTypedRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(singleTyped);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求多个节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;manyStrings&nbsp;=&nbsp;Nest.Indices.Index(&#8220;db_studnet&#8221;,&nbsp;&#8220;db_other_student&#8221;);<br /><br />var&nbsp;manyTypes&nbsp;=&nbsp;Nest.Indices.Index().And();<br /><br />ISearchRequest&nbsp;manyStringRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(manyStrings);<br /><br />ISearchRequest&nbsp;manyTypedRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(manyTypes);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">请求所有节点</span><span style="color: #008000; "><br /></span><br />var&nbsp;indicesAll&nbsp;=&nbsp;Nest.Indices.All;<br /><br />var&nbsp;allIndices&nbsp;=&nbsp;Nest.Indices.AllIndices;<br /><br />ISearchRequest&nbsp;indicesAllRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(indicesAll);<br /><br />ISearchRequest&nbsp;allIndicesRequest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SearchDescriptor().Index(allIndices);<br /><br />二、创建索引<br /><br />Elasticsearch&nbsp;API允许你创建索引的同时对索引进行配置，例如：<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CreateIndexDescriptor(&#8220;db_student&#8221;)<br /><br />.Settings(s&nbsp;=&gt;&nbsp;s.NumberOfShards(5).NumberOfReplicas(1));<br />client.CreateIndex(descriptor);<br /><br />这里指定了该索引的分片数为5、副本数为1。<br /><br />三、删除索引<br /><br />Elasticsearch&nbsp;API允许你删除索引，例如：<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DeleteIndexDescriptor(&#8220;db_student&#8221;).Index(&#8220;db_student&#8221;);<br /><br />client.DeleteIndex(descriptor)<br /><br />这里制定了要删除的索引名称&#8220;db_student&#8221;，以下为更多删除用例：<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定索引所在节点下的所有索引</span><span style="color: #008000; "><br /></span><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DeleteIndexDescriptor(&#8220;db_student&#8221;).AllIndices();<br /><br />NEST&nbsp;Mapping<br /><br />NEST提供了多种映射方法，这里介绍下通过Attribute自定义映射。<br /><br />一、简单实现<br /><br />1、定义业务需要的POCO，并指定需要的Attribute<br /><br />[ElasticsearchType(Name&nbsp;=&nbsp;&#8220;student&#8221;)]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Student<br /><br />{<br />[Nest.String(Index&nbsp;=&nbsp;FieldIndexOption.NotAnalyzed)]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Id&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br />[Nest.String(Analyzer&nbsp;=&nbsp;"standard")]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Name&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br />[Nest.String(Analyzer&nbsp;=&nbsp;"standard")]<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;Description&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;DateTime&nbsp;DateTime&nbsp;{&nbsp;<span style="color: #0000FF; ">get</span>;&nbsp;<span style="color: #0000FF; ">set</span>;&nbsp;}<br />}<br /><br />2、接着我们通过.AutoMap()来实现映射<br /><br />var&nbsp;descriptor&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CreateIndexDescriptor(&#8220;db_student&#8221;)<br /><br />.Settings(s&nbsp;=&gt;&nbsp;s.NumberOfShards(5).NumberOfReplicas(1))<br /><br />.Mappings(ms&nbsp;=&gt;&nbsp;ms<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.Map&lt;Student&gt;(m&nbsp;=&gt;&nbsp;m.AutoMap())<br /><br />);<br />client.CreateIndex(descriptor);<br /><br />注意：通过.Properties()可以重写通过Attribute定义的映射<br /><br />二、Attribute介绍<br /><br />1、StringAttribute<br /><br />2、NumberAttribute<br /><br />3、BooleanAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />Boost&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;加权值，值越大得分越高<br />NullValue&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;插入文档时，如果数据为NULL时的默认值<br /><br />4、DateAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />Boost&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;加权值，值越大得分越高<br />NullValue&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;插入文档时，如果数据为NULL时的默认值<br />Format&nbsp;<span style="color: #0000FF; ">string</span><br /><br />5、ObjectAttribute<br /><br />属性名&nbsp;值类型&nbsp;描述<br />type&nbsp;<span style="color: #0000FF; ">string</span>/Type&nbsp;构造函数参数，指定当前属性的类型T<br />Dynamic&nbsp;DynamicMapping<br /><br />NEST&nbsp;Search<br /><br />NEST提供了支持Lambda链式query&nbsp;DLS（领域特定语言）方式，以下是简单实现及各个query的简述。<br /><br />一、简单实现<br /><br />1、定义SearchDescriptor，方便项目中复杂业务的实现<br /><br />var&nbsp;query&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Nest.SearchDescriptor&lt;Models.ESObject&gt;();<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Search(x&nbsp;=&gt;&nbsp;query)<br /><br />2、检索title和content中包含key，并且作者不等于&#8220;wenli&#8221;的文档<br /><br />query.Query(q&nbsp;=&gt;<br /><br />q.Bool(b&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;b.Must(m&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.MultiMatch(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Title).Field(obj&nbsp;=&gt;&nbsp;obj.Content)).Query(key))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;.MustNot(m&nbsp;=&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.QueryString(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Author)).Query("wenli"))<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;)<br /><br />)<br />);<br /><br />注意：<br /><br />如果Elasticsearch使用默认分词，Title和Content的attribute为[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;standard&#8221;)]<br /><br />如果Elasticsearch使用的是IK分词，Title和Content的attribute为[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;ikmaxword&#8221;)]或者[Nest.String(Analyzer&nbsp;=&nbsp;&#8220;ik_smart&#8221;)]<br /><br />Author的attribute为[Nest.String(Index&nbsp;=&nbsp;FieldIndexOption.NotAnalyzed)]，禁止使用分析器<br /><br />3、过滤作者等于&#8220;wenli&#8221;的文档<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.Term(t&nbsp;=&gt;&nbsp;t.Field(obj&nbsp;=&gt;&nbsp;obj.Author).Value(&#8220;wenli&#8221;)));<br /><br />4、过滤作者等于&#8220;wenli&#8221;或者等于&#8220;yswenli&#8221;的文档，匹配多个作者中间用空格隔开<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.QueryString(t&nbsp;=&gt;&nbsp;t.Fields(f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Author)).Query(&#8220;wenli&nbsp;yswenli&#8221;)));<br /><br />5、过滤数量在1~100之间的文档<br /><br />query.PostFilter(x&nbsp;=&gt;&nbsp;x.Range(t&nbsp;=&gt;&nbsp;t.Field(obj&nbsp;=&gt;&nbsp;obj.Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));<br /><br />6、排序，按照得分倒叙排列<br /><br />query.Sort(x&nbsp;=&gt;&nbsp;x.Field("_score",&nbsp;Nest.SortOrder.Descending));<br /><br />7、定义高亮样式及字段<br /><br />query.Highlight(h&nbsp;=&gt;&nbsp;h<br /><br />.PreTags("&lt;b&gt;")<br /><br />.PostTags("&lt;/b&gt;")<br /><br />.Fields(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Title),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field(obj&nbsp;=&gt;&nbsp;obj.Content),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&gt;&nbsp;f.Field("_all")<br /><br />)<br />);<br /><br />8、拼装查询内容，整理数据，方便前段调用<br /><br />var&nbsp;list&nbsp;=&nbsp;result.Hits.Select(c&nbsp;=&gt;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Models.ESObject()<br /><br />{<br />Id&nbsp;=&nbsp;c.Source.Id,<br /><br />Title&nbsp;=&nbsp;c.Highlights&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;c.Source.Title&nbsp;:&nbsp;c.Highlights.Keys.Contains("title")&nbsp;?&nbsp;<span style="color: #0000FF; ">string</span>.Join("",&nbsp;c.Highlights["title"].Highlights)&nbsp;:&nbsp;c.Source.Title,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">高亮显示的内容，一条记录中出现了几次</span><span style="color: #008000; "><br /></span><br />Content&nbsp;=&nbsp;c.Highlights&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;c.Source.Content&nbsp;:&nbsp;c.Highlights.Keys.Contains("content")&nbsp;?&nbsp;<span style="color: #0000FF; ">string</span>.Join("",&nbsp;c.Highlights["content"].Highlights)&nbsp;:&nbsp;c.Source.Content,&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">高亮显示的内容，一条记录中出现了几次</span><span style="color: #008000; "><br /></span><br />Author&nbsp;=&nbsp;c.Source.Author,<br /><br />Number&nbsp;=&nbsp;c.Source.Number,<br /><br />IsDisplay&nbsp;=&nbsp;c.Source.IsDisplay,<br /><br />Tags&nbsp;=&nbsp;c.Source.Tags,<br /><br />Comments&nbsp;=&nbsp;c.Source.Comments,<br /><br />DateTime&nbsp;=&nbsp;c.Source.DateTime,<br />})<br /><br />二、query&nbsp;DSL介绍<br /><br />elasticsearch.net&nbsp;Document<br /><br />文档操作包含添加/更新文档、局部更新文档、删除文档及对应的批量操作文档方法。<br /><br />一、添加/更新文档及批量操作<br /><br />添加/更新单一文档<br /><br />Client.Index(student);<br /><br />批量添加/更新文档<br /><br />var&nbsp;list&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List();<br /><br />client.IndexMany(list);<br /><br />二、局部更新单一文档及批量操作<br /><br />局部更新单一文档<br /><br />client.Update&lt;Student,&nbsp;<span style="color: #0000FF; ">object</span>&gt;(&#8220;002&#8221;,&nbsp;upt&nbsp;=&gt;&nbsp;upt.Doc(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name&nbsp;=&nbsp;&#8220;wenli&#8221;&nbsp;}));<br /><br />局部更新批量文档<br /><br />var&nbsp;ids&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;{&nbsp;&#8220;002&#8221;&nbsp;};<br /><br />var&nbsp;bulkQuest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkRequest()&nbsp;{&nbsp;Operations&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;};<br /><br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;v&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;ids)<br /><br />{<br />var&nbsp;operation&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkUpdateOperation&lt;Student,&nbsp;<span style="color: #0000FF; ">object</span>&gt;(v);<br /><br />operation.Doc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name&nbsp;=&nbsp;"wenli"&nbsp;};<br /><br />bulkQuest.Operations.Add(operation);<br />}<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Bulk(bulkQuest);<br /><br />三、删除文档及批量操作<br /><br />删除单一文档<br /><br />client.Delete(&#8220;001&#8221;);<br /><br />批量删除文档<br /><br />var&nbsp;ids&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;{&nbsp;&#8220;001&#8221;,&nbsp;&#8220;002&#8221;&nbsp;};<br /><br />var&nbsp;bulkQuest&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BulkRequest()&nbsp;{&nbsp;Operations&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List()&nbsp;};<br /><br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;v&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;ids)<br /><br />{<br />bulkQuest.Operations.Add(<span style="color: #0000FF; ">new</span>&nbsp;BulkDeleteOperation&lt;Student&gt;(v));<br />}<br /><br />var&nbsp;result&nbsp;=&nbsp;client.Bulk(bulkQuest);<br /><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/96043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-08-26 14:18 <a href="http://www.cnitblog.com/yide/archive/2022/08/26/96043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES C# 增删改</title><link>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Wed, 10 Aug 2022 03:20:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/96040.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/08/10/96040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/96040.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/96040.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border-color: #cccccc; border-image: initial; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><br />索引(添加)<br />var&nbsp;settings&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConnectionSettings(<span style="color: #0000FF; ">new</span>&nbsp;Uri("http://****:9200/")).DefaultFieldNameInferrer(name&nbsp;=&gt;&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;client&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ElasticClient(settings);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">index、indexDocument：添加</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse1&nbsp;=&nbsp;client.IndexDocument&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4,&nbsp;Name&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Name&nbsp;{&nbsp;Firstname&nbsp;=&nbsp;"wj",&nbsp;Lastname&nbsp;=&nbsp;"f"&nbsp;}&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse2&nbsp;=&nbsp;client.Index&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4&nbsp;},&nbsp;i&nbsp;=&gt;&nbsp;i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index("my_index")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Id(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Routing("1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Refresh(Refresh.True));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;indexResponse3&nbsp;=&nbsp;client.IndexDocument&lt;People&gt;(<span style="color: #0000FF; ">new</span>&nbsp;People&nbsp;{&nbsp;Id&nbsp;=&nbsp;4,&nbsp;Age&nbsp;=&nbsp;4,&nbsp;Name&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Name&nbsp;{&nbsp;Firstname&nbsp;=&nbsp;"wj",&nbsp;Lastname&nbsp;=&nbsp;"f"&nbsp;}&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />删除<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">delete、deleteByQuery：删除</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定id文档</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.Delete&lt;ElasticUserModel&gt;(3,&nbsp;d&nbsp;=&gt;&nbsp;d.Index("index13"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">删除指定条件的文档</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.DeleteByQuery&lt;ElasticUserModel&gt;(d&nbsp;=&gt;&nbsp;d.Index("index13").Query(q&nbsp;=&gt;&nbsp;q.Term("UserID",&nbsp;4)));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />修改<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">update：修改</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Update&lt;object&gt;只会修改指定的字段，如下只修改Name，其他字段不变。</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;updateResponse&nbsp;=&nbsp;client.Update&lt;<span style="color: #0000FF; ">object</span>&gt;(2,&nbsp;u&nbsp;=&gt;&nbsp;u<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index("index13")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Doc(<span style="color: #0000FF; ">new</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;=&nbsp;"fan22"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />批量增删改<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">bulk：批量增删改</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;bulkResponse&nbsp;=&nbsp;client.Bulk(b=&gt;b<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Update&lt;<span style="color: #0000FF; ">object</span>&gt;(u=&gt;u.Index("index13").Id(2).Doc(<span style="color: #0000FF; ">new</span>&nbsp;{&nbsp;Name="fan222"&nbsp;}))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Delete&lt;ElasticUserModel&gt;(d=&gt;d.Index("index13").Id(1))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Index&lt;ElasticUserModel&gt;(i=&gt;i.Index("index13").Document(<span style="color: #0000FF; ">new</span>&nbsp;ElasticUserModel&nbsp;{UserID=11,Name="fan11",Age=11,CreateTime=DateTime.Now,Handle="handle11"&nbsp;}))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />version（乐观锁）<br />查询时获取文档版本号，修改时传版本号，如果相同就修改<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">查询到版本号</span><span style="color: #008000; "><br /></span>&nbsp;var&nbsp;result&nbsp;=&nbsp;_client.Search&lt;TestModel5&gt;(<br />&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.Index(indexName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Query(q&nbsp;=&gt;&nbsp;q.Term(tm&nbsp;=&gt;&nbsp;tm.Field(fd=&gt;fd.State).Value(1))).Size(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Version()<span style="color: #008000; ">//</span><span style="color: #008000; ">结果中包含版本号</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /><span style="color: #0000FF; ">foreach</span>&nbsp;(var&nbsp;s&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;result.Hits)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(s.Id&nbsp;+&nbsp;"&nbsp;&nbsp;-&nbsp;&nbsp;"&nbsp;+&nbsp;s.Version);<br />}<br /><br />var&nbsp;path&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DocumentPath&lt;TestModel5&gt;(1);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">更新时带上版本号&nbsp;如果服务端版本号与传入的版本好相同才能更新成功</span><span style="color: #008000; "><br /></span>var&nbsp;response&nbsp;=&nbsp;_client.Update(path,&nbsp;(p)&nbsp;=&gt;&nbsp;p<br />&nbsp;&nbsp;&nbsp;&nbsp;.Index(indexName)<br />&nbsp;&nbsp;&nbsp;&nbsp;.Type(<span style="color: #0000FF; ">typeof</span>(TestModel5))<br />&nbsp;&nbsp;&nbsp;&nbsp;.Version(2)<span style="color: #008000; ">//</span><span style="color: #008000; ">限制es中版本号为2时才能成功</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;.Doc(<span style="color: #0000FF; ">new</span>&nbsp;TestModel5()&nbsp;{&nbsp;Name&nbsp;=&nbsp;"测测测"&nbsp;+&nbsp;DateTime.Now&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br /><br /><br /><br /><br /></div><img src ="http://www.cnitblog.com/yide/aggbug/96040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-08-10 11:20 <a href="http://www.cnitblog.com/yide/archive/2022/08/10/96040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES SEARCH 数据限制</title><link>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Thu, 14 Jul 2022 03:09:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95728.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/07/14/95728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95728.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95728.html</trackback:ping><description><![CDATA[<div>一般我们使用es的可视化工具来操作es</div><div></div><div>我们进入kibana的页面通过</div><div></div><div>http://ip:5601/app/kibana</div><div>在设置中找到索引管理</div><div></div><div>找到我们需要修改的索引,选择Edit settings,</div><div></div><div>添加"index.max_result_window": "1000000",</div><div></div><div>最后save就可以了</div><img src ="http://www.cnitblog.com/yide/aggbug/95728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-07-14 11:09 <a href="http://www.cnitblog.com/yide/archive/2022/07/14/95728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ES ip访问</title><link>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html</link><dc:creator>青蛙學堂</dc:creator><author>青蛙學堂</author><pubDate>Fri, 01 Jul 2022 06:33:00 GMT</pubDate><guid>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html</guid><wfw:comment>http://www.cnitblog.com/yide/comments/95668.html</wfw:comment><comments>http://www.cnitblog.com/yide/archive/2022/07/01/95668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/yide/comments/commentRss/95668.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/yide/services/trackbacks/95668.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; margin-bottom: 16px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; padding-top: 0px; padding-bottom: 0px; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto;">在虚拟机安装Elasticsearch后，浏览器可以正常访问9200端口，但是在宿主机上无法通过虚拟机地址加9200端口进入，找了很多资料，说的是修改配置文件elasticsearch.yml，加上network.host: 0.0.0.0，加上这条配置后es无法启动，最后查到需要加上如下四条配置，只加一条无法启动。</p><pre style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;; font-size: 13px; white-space: pre-wrap; padding: 0px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; color: #333333; word-break: break-all; overflow-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px;"><code style="box-sizing: border-box; font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;; font-size: inherit; padding: 0px; color: inherit; background-color: transparent; border-radius: 0px;">network.host: 0.0.0.0 http.port: 9200 transport.host: localhost transport.tcp.port: 9300</code></pre><img src ="http://www.cnitblog.com/yide/aggbug/95668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/yide/" target="_blank">青蛙學堂</a> 2022-07-01 14:33 <a href="http://www.cnitblog.com/yide/archive/2022/07/01/95668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>