- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
C# 中访问 Elasticsearch 主要通过两个包 NEST 和 Elasticsearch.Net , NEST 用高级语法糖封装了 Elasticsearch.Net 可以通过类 Linq 的方式进行操作,而 Elasticsearch.Net 相比之下更为原始直接非常自由.
注意: ES 的 8.X 以上的版本有新的包 Elastic.Clients.Elasticsearc 支持.
此处使用 NEST ,我们通过 Nuget 安装,如下图:
1、准备结构 。
准备以下实体 。
public class Company { public string Id { get ; set ; } public string Name { get ; set ; } public string Description { get ; set ; } public User User { get ; set ; } } public class User { public string Name { get ; set ; } public int Gender { get ; set ; } }
2、连接ES 。
如果是单机连接如下代码,可以直接在 Uri 上指定账号密码,也可以使用 ConnectionSettings 的 BasicAuthentication 来配置账号密码:
var singleNode = new Uri( " http://elastic:123456@localhost:9200 " ); var connSettings = new ConnectionSettings(singleNode);
//connSettings.BasicAuthentication("elastic", "123456"); var esClient = new ElasticClient(connSettings);
如果是多个节点集群则如下代码:
var nodes = new Uri[] { new Uri( " http://esNode1:9200 " ), new Uri( " http://esNode2:9200 " ), new Uri( " http://esNode3:9200 " ) }; var pool = new StaticConnectionPool(nodes); var settings = new ConnectionSettings(pool); var client = new ElasticClient(settings);
3、创建索引 。
索引名称必须符合规则否则创建会失败,比如索引只能小写,具体代码如下:
var indexName = " my_index1 " ;// 索引名称 var res = await esClient.Indices.CreateAsync(indexName, o => o.Map(g => g.AutoMap<Company>()));//映射结构
也可以在向索引插入数据的时候自动判断是否存在索引,不存在会自动创建。 索引结构字段映射一但创建就无法修改,可以通过新建索引然后转移数据的方式修改索引结构,但是可以往里面新增字段映射,比如修改了实体结构新的字段将会被映射.
4、插入数据 。
使用 IndexDocumentAsync 方法插入单条数据需要在 ConnectionSettings 的 DefaultIndex 方法设置默认索引。使用 IndexAsync 插入单条数据时需要选择指定索引,如下:
var singleNode = new Uri( " http://localhost:9200 " ); var connSettings = new ConnectionSettings(singleNode); connSettings.BasicAuthentication( " elastic " , " 123456 " ); var esClient = new ElasticClient(connSettings.DefaultIndex( " my_index1 " )); var indexName = " my_index1 " ; var company = new Company() { Name = " 超级公司bulk " , Description = " 超级描述bulk " , }; var res1 = await esClient.IndexDocumentAsync(company); var res2 = await esClient.IndexAsync(company, g => g.Index(indexName))
如果需要批量插入需要用 BulkDescriptor 对象包裹,然后使用 BulkAsync 方法插入,或者不要包裹直接用 IndexManyAsync 方法插入,具体如下:
var company = new Company() { Name = " 超级公司bulk " , Description = " 超级描述bulk " }); BulkDescriptor descriptor = new BulkDescriptor(); descriptor.Index <Company>(op => op.Document(company).Index(indexName)); var res = await esClient.BulkAsync(descriptor); // var list = new List<Company>(); // list.Add(company); // var res = await esClient.IndexManyAsync(list, indexName);
如果实体有 Id 则会使用 Id 的值做为 _id 的索引文档唯一值,或者可以通过手动指定如 await esClient.IndexAsync(company, g => g.Index(indexName).Id(company.Id)) ,如果id相同执行插入操作则为更新不会重复插入。在新增后是会返回id等信息可以加以利用.
5、删除数据 。
删除指定单条数据需要知道数据的 id ,如下两种方式:
DocumentPath<Company> deletePath = new DocumentPath<Company> (Guid.Empty); var delRes = await esClient.DeleteAsync(deletePath, g => g.Index(indexName)); // 或者 IDeleteRequest request = new DeleteRequest(indexName, " 1231 " ); var delRes = await esClient.DeleteAsync(request);
多条删除使用 DeleteByQueryAsync 方法进行匹配删除,下面两种方式等价,删除 Description 字段模糊查询有 描述 的数据(最多10条):
var req = new DeleteByQueryRequest<Company> (indexName) { MaximumDocuments = 10 , // 一次最多删几条 Query = new MatchQuery() { Field = " description " , Query = " 描述 " } }; var result = await esClient.DeleteByQueryAsync(req); // 等价于 var result = await esClient.DeleteByQueryAsync<Company>(dq => dq.MaximumDocuments( 10 ).Query( q => q.Match(tr => tr.Field(fd => fd.Description).Query( " 描述 " ))).Index(indexName) );
6、更新数据 。
除了上述插入数据时自动根据 id 进行更新外还有以下的主动更新.
根据 id 更新单条数据以下代码等价,可以更新部分字段值,但是 _id 是确定就不会更改的虽然对应的 Id 字段已被修改:
DocumentPath<Company> deletePath = new DocumentPath<Company>( " 1231 " ); var res = await esClient.UpdateAsync(deletePath ,(p) => p.Doc(company).Index(indexName)); // 等价于 IUpdateRequest<Company, Company> request = new UpdateRequest<Company, Company>(indexName, " 1231 " ) { Doc = new Company() { Id = " 888 " , Description = " 11111 " , } }; var res = await esClient.UpdateAsync(request);
如果有多个 id 更新多条数据可以用如下方法:
var res = esClient.Bulk(b => b.UpdateMany( new List<Company>() { new Company() { Id = " 1231 " , } }, (b, u) => b.Id(u.Id).Index(indexName).Doc( new Company { Name = " 我无语了 " })));
通过条件批量更新如下, 。
var req = new UpdateByQueryRequest<Company> (indexName) { MaximumDocuments = 10 , // 一次最多更新几条 Query = new MatchQuery() { Field = " description " , Query = " 66 " , }, Script = new ScriptDescriptor() .Source($ " ctx._source.description = params.description; " ) .Params( new Dictionary< string , object > { { " description " , " 小时了123123123 " } }), Refresh = true }; var result = await esClient.UpdateByQueryAsync(req);
7、数据查询 。
上文中的更新等都用到了查询过滤,此处就用网上的这个例子吧:
var result = client.Search<VendorPriceInfo> ( s => s .Explain() // 参数可以提供查询的更多详情。 .FielddataFields(fs => fs // 对指定字段进行分析 .Field(p => p.vendorFullName) .Field(p => p.cbName) ) .From( 0 ) // 跳过的数据个数 .Size( 50 ) // 返回数据个数 .Query(q => q.Term(p => p.vendorID, 100 ) // 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed的字符串(未经分析的文本数据类型): && q.Term(p => p.vendorName.Suffix( " temp " ), " 姓名 " ) // 用于自定义属性的查询 (定义方法查看MappingDemo) && q.Bool( // bool 查询 b => b .Must(mt => mt // 所有分句必须全部匹配,与 AND 相同 .TermRange(p => p.Field(f => f.priceID).GreaterThan( " 0 " ).LessThan( " 1 " ))) // 指定范围查找 .Should(sd => sd // 至少有一个分句匹配,与 OR 相同 .Term(p => p.priceID, 32915 ), sd => sd.Terms(t => t.Field(fd => fd.priceID).Terms( new [] { 10 , 20 , 30 })), // 多值 // || // sd.Term(p => p.priceID, 1001) // || // sd.Term(p => p.priceID, 1005) sd => sd.TermRange(tr => tr.GreaterThan( " 10 " ).LessThan( " 12 " ).Field(f => f.vendorPrice)) ) .MustNot(mn => mn // 所有分句都必须不匹配,与 NOT 相同 .Term(p => p.priceID, 1001 ) , mn => mn.Bool( bb =>bb.Must(mt=> mt .Match(mc =>mc.Field(fd=>fd.carName).Query( " 至尊 " )) )) ) ) ) // 查询条件 .Sort(st => st.Ascending(asc => asc.vendorPrice)) // 排序 .Source(sc => sc.Include(ic => ic .Fields( fd => fd.vendorName, fd => fd.vendorID, fd => fd.priceID, fd => fd.vendorPrice))) // 返回特定的字段 );
。
最后此篇关于.NetCore中使用NEST简单操作Elasticsearch的文章就讲到这里了,如果你想了解更多关于.NetCore中使用NEST简单操作Elasticsearch的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!