利用NEST2.0 在C#中操作Elasticsearch
前言:本文主要演示了如何通过c#来操作elasticsearch,分两个方面来演示:
索引数据
搜索数据
Note: 注意我索引数据和搜索数据是两个不同的例子,没有前后依赖关系
准备工作:需要在visual studio 用NuGet 搜索 NEST,下载NEST 2.3即可
注意elasticsearch和 NEST的版本,版本差异可能会导致写法不同
一、 索引数据演示
下面的c#代码有如下要点:
1. 通过es服务器 localhost:9200来定义es client
2. 导入前通过定义字段类型的类,自动mapping
var mappingBlogPost = elastic.Map(s => s.AutoMap());
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; }
}
}
3. 构造数据
4. 导入数据
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也已经创建。可以通过Kibana或者REST API进行查看
二、搜索数据演示
1. 此处的数据源是es官网的bank account,我已经提前手动导入
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;
}
}
}
利用NEST2.0 在C#中操作Elasticsearch的更多相关文章
- 《SeleniumBasic 3.141.0.0 - 在VBA中操作浏览器》系列文章之一:SeleniumBasic的下载
Selenium是一种非常流行的浏览器和网页自动化技术,开发人员可以使用C#.Java.Python等语言来操作Chrome.Firefox等浏览器. VBA语言可以直接操作访问Microsoft I ...
- Elastic:Sense chrome - 在 chrome 浏览器中操作 Elasticsearch 的插件
文章转载自:https://elasticstack.blog.csdn.net/article/details/114533904 Sense 是我们现在所说的 Kibana 控制台 UI 的第一个 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版
原文 [译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵 ...
- 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本
原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 利用列进行排版(转)
[译]在Asp.Net中操作PDF - iTextSharp - 利用列进行排版 在使用iTextSharp通过ASP.Net生成PDF的系列文章中,前面的文章已经讲述了iTextSharp所涵盖 ...
- android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...
- elk快速入门-在kibana中如何使用devtools操作elasticsearch
在kibana中如何使用devtools操作elasticsearch:前言: 首先需要安装elasticsearch,kibana ,下载地址 https://www.elastic.co/cn/d ...
- MVC4.0 利用IActionFilter实现简单的后台操作日志功能
首先我们要了解MVC提供了4种常用的拦截器:IActionFilter(Action拦截器接口).IExceptionFilter(异常拦截器接口).IResultFilter(Result拦截器接口 ...
- 如何在python中使用Elasticsearch
什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度.谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据.然而对于我们自己的业务数据来说 ...
随机推荐
- 生活沉思录 via 哲理小故事(一)
1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...
- Centos6.9下安装并使用VNC的操作记录
VNC是一个的"远程桌面"工具.,通常用于“图形界面”的方式登录服务器,可视化操作.废话不多说了,操作记录如下: 1)安装桌面环境 [root@vm01 ~]# yum -y gr ...
- Linux下selinux简单梳理
在linux环境下执行某些程序时,偶尔会遇到来一个关于selinux的强制模式不可执行的情况,这种情况下需要关闭selinux或者将enforcing改为permissive模式后才能进行执行.sel ...
- python基础学习笔记(六)
学到这里已经很不耐烦了,前面的数据结构什么的看起来都挺好,但还是没法用它们做什么实际的事. 基本语句的更多用法 使用逗号输出 >>> print 'age:',25 age: 25 ...
- iOS推送证书生成pem文件(详细步骤)
1.pem文件概述 pem文件是服务器向苹果服务器做推送时候需要的文件,主要是给php向苹果服务器验证时使用,下面介绍一下pem文件的生成. 2.生成pem文件步骤 1.打开钥匙串,选择需要生成的推送 ...
- docker+redis 持久化配置(AOF)
RDB持久化与AOF持久化简单描述 RDB:RDB使用快照的方式存储数据库中的内容,直接将所有键值对数据全部存入二进制文件.建议使用BGSAVE来进行备份,整个过程会新fork一个子进程来执行,不影响 ...
- 使用YII框架的migrate迁移数据库
框架版本:2.0.13 官网手册说明:http://www.yiichina.com/doc/guide/2.0/db-migrations 创建迁移 命令的格式: php yii migrate/c ...
- win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决办法 收藏
win8和win7下解决php5.3和5.4.5.5等不能加载php_curl.dll的终极解决办法 收藏2015年01月11日 最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到 ...
- CS、IP和PC寄存器
CS寄存器和IP寄存器: 首先强调一下,这两个寄存器非常非常重要,CS的全拼为“Code segment”,即代码段寄存器,对应于内存中的存放代码的内存区域,用来存放内存代码段区域的入口地址(段基址) ...
- 手动安装ettercap的过程
知乎推送了一个中间人攻击的软件 ettercap 想着尝试进行一下安装学习, 如果有机会的话安全测试部分应该用的到. 1. 下载: wget https://codeload.github.com/E ...