利用NEST2.0 在C#中操作Elasticsearch
来源:互联网 发布:before sunrise 知乎 编辑:程序博客网 时间:2024/05/17 20:25
本文从两个方面简单描述下NEST的用法:
- 索引数据
- 搜索数据
注意我索引数据和搜索数据是两个不同的例子。没有衔接关系
NOTE :NEST操作es,存储数据的类型应该是要已知的
准备工作:需要在visual studio 用NuGet 搜索 NEST,下载NEST 2.3即可
一、索引数据:
下段代码有如下要点:
1.通过es服务器 localhost:9200来定义es client
2.导入前通过定义字段类型的类,自动mapping,如下:
var mappingBlogPost = elastic.Map(s => s.AutoMap());
3.构造数据
4.导入数据 elasticsearch.Index
using Nest;using System;using System.Linq;namespace BotEsNest{ public class ImportEs { public static string ElasticsearchMethod() { var node = new Uri("http://localhost:9200"); var indexName = "esbot"; var settings = new ConnectionSettings(node).DefaultIndex(indexName); var elastic = new ElasticClient(settings); // var res = elastic.ClusterHealth(); // Console.WriteLine(res.Status); // if (!elastic.IndexExists(indexName).Exists) { var createIndexResponse = elastic.CreateIndex(indexName); var mappingBlogPost = elastic.Map<Resume>(s => s.AutoMap()); //Console.WriteLine("createIndexResponse=" + createIndexResponse.IsValid); //Console.WriteLine("mappingBlogPost=" + mappingBlogPost.IsValid); } // string[] nameArray = { "Cody", "Blake", "Dennis", "Evan ", "Harris", "Jason ", "Lambert ", "Louis ", "Milton ", "Cody" }; string[] skillArray = { "c#", "c++", "java", "python", "php", "Linux", "ruby", "matlab", "perl", "powershell" }; long[] ageRange = { 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; for (int i = 0; i < 10; i++) { var resume = new Resume { Id = Guid.NewGuid(), Name = nameArray[i], Age = ageRange[i], Skills = "My skill is Azure and " + skillArray[i] }; IIndexResponse bulkIndexReponse = elastic.Index(resume, p => p .Type(typeof(Resume)) .Id(i) .Refresh()); } var searchResult = elastic.Search<Resume>(sr => sr .Query(q => q.MatchAll()) ); //Console.WriteLine(searchResult.Hits.Count()); //Console.ReadLine(); var resumesCount = searchResult.Hits.Count().ToString(); return resumesCount; } }}
搜索返回的信息都包含在searchResult中。索引esbot也已经创建。可以通过sense或者curl进行查看
Resume 这个类要提前根据数据类型进行定义:
using System;namespace BotEsNest{ using Nest; [ElasticsearchType(Name = "candidate", IdProperty = "Id")] public class Resume { [String(Name = "id", Index = FieldIndexOption.NotAnalyzed)] public Guid? Id { get; set; } [String(Name = "name", Index = FieldIndexOption.Analyzed)] public string Name { get; set; } [String(Name = "age", Index = FieldIndexOption.NotAnalyzed)] public long Age { get; set; } [String(Name = "skills", Index = FieldIndexOption.Analyzed)] public string Skills { get; set; } }}
二、搜索数据
1.此处我数据源是es官方的bank实例,并提前导入
2.搜索数据的关键在于用lambda表达式构造搜索内容
下段代码是为了动态定制参数所做
using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Web;namespace BotEsNest.Ext{ public class Extension { public static Dictionary<string, Expression<Func<Resume, object>>> ResumeDIctionary() { return new Dictionary<string, Expression<Func<Resume, object>>> { { "age",p=>p.Age}, { "name",p=>p.Name} }; } public static Dictionary<string, Expression<Func<Bank, object>>> BankDictionary() { return new Dictionary<string, Expression<Func<Bank, object>>> { { "account_number",p=>p.account_number}, { "age",p=>p.age}, {"balance",p=>p.balance}, }; } }}
3.定义搜索类型:
using Nest;namespace BotEsNest{ [ElasticsearchType(Name = "account", IdProperty = "Id")] public class Bank { public long account_number { get; set; } public string address { get; set; } public long age { get; set; } public long balance { get; set; } public string city { get; set; } public string email { get; set; } public string employer { get; set; } public string firstname { get; set; } public string gender { get; set; } public string lastname { get; set; } public string state { get; set; } }}
4.进行搜索:
我大概写了三种搜索方式:
比如:返回存款在40000到40100的人,返回数据中带有Miltoon的人,返回数据中带有35的人
返回结构存在searchResponse中,未作继续处理,有兴趣的可以继续优化处理
using System;using Nest;using BotEsNest.Ext;namespace BotEsNest{ public class Elasticsearch { public static string indexName = "bank"; public static Uri node = new Uri("http://localhost:9200"); public static ConnectionSettings settings = new ConnectionSettings(node).DefaultIndex(indexName); public static ElasticClient elastic = new ElasticClient(settings); public static ISearchResponse<Bank> esSearchNumber() { // string dictionaryKey = "balance"; var dictionary = Extension.BankDictionary(); var rangeField = dictionary[dictionaryKey]; var gt = 40000; var lt = 40100; var searchResponse = elastic.Search<Bank>(es => es .Query(q => q .Range(r => r .Name("") .Field(rangeField) .GreaterThan(gt) .LessThan(lt) .Boost(2.0)))); return searchResponse; } public static ISearchResponse<Bank>esSearchString() { string quertStr = "Miltoon"; var searchResponse = elastic.Search<Bank>(es => es .Query(q => q.QueryString(qs => qs.Query(quertStr)) )); return searchResponse; } public static ISearchResponse<Bank>esSearchField() { string queryStr = "35"; string dictionaryKey = "age"; var dictionary = Extension.BankDictionary(); var rangeField = dictionary[dictionaryKey]; var searchResponse = elastic.Search<Bank>(es => es .Query(q => q .Match(m => m .Field(rangeField) .Query(queryStr)))); return searchResponse; } }}
0 0
- 利用NEST2.0 在C#中操作Elasticsearch
- 在C#中利用wmi操作DNS服务器
- 在C#中利用SQL语句与数据库进行操作
- Elasticsearch Alias第三篇 在endpoint中操作
- C#中利用Handle的操作
- Unity3d中利用C#操作SQLite数据库
- 在C#中操作XML
- 在C#中操作XML
- 在C#中操作XML
- 在 C# 中操作 XML
- 在C#中操作XML
- 在c#中操作xml
- 在C#中操作XML
- 在C#中操作XML
- 在C#中操作XML
- 在C#中操作XML
- 在C#中操作XML
- 在C#中操作XML
- leetcode100. Same Tree
- 如何编辑pdf文件 在pdf中添加图章的方法
- RxJava2+Retrofit2+MVP+lamdba仿微信朋友圈Demo
- Android中的ANR
- jdk和jre的区别
- 利用NEST2.0 在C#中操作Elasticsearch
- SpringMVC--核心组件
- mysql 日期转化为时间戳精析
- AlloyTouch实战--60行代码搞定QQ看点资料卡
- 二进制、八进制、十进制、十六进制之间的转换
- PgSql备份pg_dump与还原手记pg_restore(转)
- SpringBoot JPA实现增删改查、分页、排序、事务操作等功能
- Scoped CSS规范草案
- memcached-缓存应用问题