
本文实例为大家分享了弹性搜索。网使用教程,供大家参考,具体内容如下
首先去官网下载弹性搜索2.3.4安装包,解压后,在煤矿管理局命令行进入安装目录,再进入容器目录,运行elasticsearch.bat命令。
弹性搜索插件弹性搜索头安装:
容器目录下执行命令插件-安装mobz/弹性搜索头
然后开始。网编程,构建控制台应用程序
Program.cs代码如下:
类程序{静态void Main(字符串[]参数){ Console .写线(' *程序开始运行":"日期时间。现在);定义变量业务=新业务();var swRead=new秒表();//swRead .start();//业务. AddToDb();//sqlserver数据库增加数据//swRead .stop();//控制台。写线('数据库写入时间: ' swRead .elapsedmirisseconds秒);//swRead .reset();//swRead .start();//业务addtolastindex();//swRead .stop();//控制台。写线(' ES写入时间: ' swRead .elapsedmirisseconds秒);var sw=新秒表();西南航空start();var personsFromDB=业务.GetFromDB();西南航空stop();控制台。写线('数据库读时间西南:英尺elapsedmirisseconds秒);西南航空reset();西南航空start();var personsFromEs=business .GetFromES();西南航空stop();控制台。写线(' ES读时间西南:英尺elapsedmirisseconds秒);控制台ReadLine();} } BLL层的Business.cs类:
公共类业务{私人列表个人详细信息_个人列表=新列表个人详细信息();//SQLSERVER数据库PersonDbProvider dbProvider=new PersonDbProvider();//弹性搜索ESProvider ESProvider=new ESProvider();public void AddToDb(){ _ person list=Util .get10000个人详细信息();//辅助类,生成10000条数据foreach(var _ person list中的人员详细信息){ DBProvider .添加人员(人员详细信息);} } public void addtoelastic index(){ _ person list=Util .get 10000 person detailswithid();foreach(var _ person list中的人员详细信息){ esProvider .索引(人员详细信息);} }公共列表人员详细信息GetFromDB(){返回数据库提供程序.GetAllPersonDetails();}公共列表人员详细信息GetFromES(){ return esProvider .GetAll();} } PersonDbProvider.cs和ElasticSearchProvider.cs以及实用计算机,设置计算机类:
公共类person db provider { public bool AddPerson(person detail person detail){ try {//数据库上下文使用(var db=new PersonContext()) { db .人员详细信息。添加(人员详细信息);db .saveChanges();返回真;} } catch(Exception){ return false;} }公共列表个人详细信息getall personal details(){ }尝试使用(var db=新的个人上下文()){ return db .人员详细信息。to list();} } catch(异常){返回null} } }公共类ESProvider {公共静态弹性客户端=新弹性客户端(设置. ConnectionSettings);公共布尔指数(人员详细信息人员){ var客户端=新弹性客户端(设置. ConnectionSettings);尝试{ //添加数据//在调用下面的指数方法的时候,如果没有指定使用哪个弹性搜索索引会直接使用我们在环境中的defaultIndex,如果没有,则会自动创建定义变量索引=客户端。指数(人);收益指数。已创建;} catch(异常例如){控制台.写线('例外消息: '例如。消息);}返回false}公共列表人员详细信息GetAll(){ var搜索结果=client .搜索人员详细信息(0)。大小(10000));返回搜索结果文件。to list();}公共列表人员详细信息GetEntities(字符串关键字){ var client=new ElasticClient(设置. ConnectionSettings);#地区全文搜索关键字=字符串。格式(' *{0}*,关键字);//默认的操作员是或者,当关键字是类似于一二之类的中间有空格的时候,会被当成两个关键词搜索,然后搜索结果进行或者运算//所以我们需要根据需求来调整运算符var searchResults=客户端搜索个人详细信息(s=s . Index('弹性搜索应用')。查询(q=q.QueryString(qs=qs .查询(关键字)。默认运算符(运算符。和))));//- //另外由于萨尔瓦多是分词搜索,所以当我们要用一个来搜索完整的单词只有一个的时候,就必须在一个外面添加**,类似于结构化查询语言里面的%关键字%,但是这样的做法会导致在用完整的单词来搜索的时候搜索不到结果,所以我们需要使用下面的方式//整关键字=关键字;//关键字=字符串。格式(' *{0}*,关键字);//QueryContainer查询=new QueryStringQuery() { Query=关键字,DefaultOperator=运算符。和};//if(!字符串IsNullOrEmpty(整体关键字))//{ //QueryContainer整体文字查询=new QueryStringQuery() { Query=整体关键字};//query=query | |全字查询;//} //var searchResults=client .搜索者.索引('小智-应用')//。查询(query)//);# endregion #区域指定属性搜索//使用术语查询//术语是一个被索引的精确值,也就是说福,福,福是不相等的,因此//在使用术语查询的时候要注意,术语查询在搜索的田已经被索引的时候,是不支持大写的//QueryContainer query2=新术语查询{字段=项目.键,值=项目价值。toLower()};//////var搜索结果=客户端.search personal detail(s=s/).索引(“弹性搜索应用”)//.查询(q=q . Term(t=t . on field(f=f .姓氏==' keyword ')))//);//效果同上//查询容器术语查询=新术语查询{字段='姓氏',值='关键字' };//var searchResults=client .search personal detail(s=s/).索引(“弹性搜索应用”)//.查询(术语查询)//);//- //使用查询字符串查询//查询字符串查询一般用于全文搜索,但是也可以用于单个属性的搜索(设置默认字段属性),queryString查询可以不区分大小写。
查询字符串还有一个好处就是我们可以搜索一个学期中的一部分, //例如姓为t Boterhuis 1 ',那么我们可以用terhuis搜索到这个数据(虽然需要在外面包上**),在术语查询里面就做不到,因为萨尔瓦多把每一个属性的值都分析成一个个单独的术语,提高了搜索的效率//关键字=' t Boterhuis 2//查询容器全字查询=新的查询字符串Query(){ Query=关键字,DefaultOperator=运算符。和};//var searchResults=client .search personal detail(s=s/).索引(“弹性搜索应用”)//.查询(全麦查询)///);#endregion返回搜索结果文件。to list();}公共列表人员详细信息排序(字符串关键字){ //首先我们把原先的索引先删除了定义变量响应=客户端。删除索引(新的删除索引请求(新的索引名称标记(){ Name='elastic-search-app ',Type=Type of(个人详细资料)});//然后重新创建索引var indexResult=客户端创建索引(' PD-application ');var响应1=客户端MapPersonDetail(m=m . mapfromAttributes());IEnumerablePersonDetail persons=new listerpersondetail { new PersonDetail(){ Id=4,FirstName='Boterhuis-040 ',LastName='Gusto-040 ',},new PersonDetail() { Id=5,FirstName='[emailprotected]',LastName='t Boterhuis 1 ',},new PersonDetail() { Id=6,FirstName='Aberdeen #110 ',LastName='[emailprotected]',},new PersonDetail() { Id=7,first指数(人);} var searchResults=client .搜索人员详细信息(s=s .索引(' PD-应用').排序(排序=排序。现场(f=f.Id).订单(排序订单。升序)));返回搜索结果文件。to list();} }公共静态类Util { //生成10000条sqlserver测试数据public static listener detail get 10000个个人详细信息(){ var personal details list=new listener detail();for(int I=0;我10000;i ) {人员详细信息列表.添加(新的PersonDetail() { FirstName='FN '新的Random().下一个(int .MaxValue),LastName='LN' new Random().下一个(int .maxVaLue)});}返回personDetailsList} //生成10000条弹性搜索测试数据public static侦听器detail get 10000 person detail with id(){ var person detail list=new listener detail();for(int I=0;我10000;i ) {人员详细信息列表.添加(新的PersonDetail() { Id=i *新的Random().Next(99),FirstName='FN' new Random().下一个(int .MaxValue),LastName='LN' new Random().下一个(int .maxVaLue)});}返回个人详细信息列表} }公共静态类设置{公共静态Uri Node { get { return new Uri(' http://localhost :9200 ');} } //连接配置公共静态连接设置连接设置{ get {返回新的ConnectionSettings(Node,defaultindex : ' es-index-app ');} } }型号层代码:
公共分部类PersonDetail { public long Id { get设置;}公共字符串名字{ get设置;}公共字符串姓氏{ get设置;} }公共分部类人员上下文:数据库上下文{静态人员上下文(){数据库.set initializer person context(null);} public person context(): base(' Name=person context '){ } public dbset person detail person details { get;设置;}受保护的覆盖void onmodel正在创建(DBmodelBuilder模型生成器){//在重写OnModelCreating方法中则可以直接调用映射类,从而减少了OnModelCreating方法的复杂度,同时也增强了代码维护的可读性模型构建器。配置。添加(新的person detail map());//属性映射约定} }//流畅的应用程序接口配置配置映射类公共类person detail map : entitytypeconfigurationpersonal detail { public person detail map(){//主键这个HasKey(t=new { t.Id,t.FirstName,t .姓氏});//属性这个。属性(t=t.Id).哈斯数据库生成选项(数据库生成选项。身份);这个。属性(t=t.FirstName).IsRequired();这个。属性(t=t.LastName).IsRequired();//表列映射这个ToTable('个人详细信息');这个。属性(t=t.Id).有列名('标识');这个。属性(t=t.FirstName).hascolumn名称('名字');这个。属性(t=t.LastName).hascolumn名称('姓氏');} } sqlserver脚本:
使用[人员]围棋,围棋设置为空,围棋设置为带引号的标识符,创建表格。[人员详细信息]([Id] [bigint] IDENTITY(1,1)不为空,[名字] [nvarchar](最大)不为空,[姓氏] [nvarchar](最大)不为空)在[主] GO上结果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。