现在主流网站,APP都有“站内搜索”的功能:优酷,爱奇艺,链家,携程......等等。如果用SQL做站内搜索的话,
例如:select * from t where Title like '%西游记%' 这种方式的缺点就是:容易全表扫描,性能不好,对数据库的压力大
现在我们一种搜索引擎服务器可以解决我们的问题
全文检索引擎开发包有 Lucene ,Solr ,Elastic Search等
其中Lucene是Java编写的全文检索引擎引擎底层开发包,它也有.Net移植版本,叫Lucene.Net 。基于Lucene开发难度比较大。因此有人开发出了基于Lucene的搜索引擎服务器,Solr ,Elastic Search等
现在我们要讲的就是Elasticc Search搜索引擎服务器
Elasticc Search搜索引擎服务器简称ES ,它是使用Java开发的,因此运行的时候要配置Java的运行环境。这些搜索引擎服务器都是“客户端SDK+服务器”的这种使用方法
第一步:Elasticc Search安装
1> 下载安装Java运行环境JDK1.8
2> Java的环境变量配置
win7系统: 首先右击【计算机】进入【属性】然后选择其中的【高级系统设置】点击进入【高级】中的【环境变量】,进入环境变量编辑界面。
点击新建
变量名(N)叫 JAVA_HOME
变量值 就是你Java JDB1.8的安装目录
点击确定,那么Java的环境变量配置就配置好了
第二步:下载安装Elasticc Search
去官网地址下载 Elasticc Search:https://www.elastic.co/cn/downloads/elasticsearch
我下载的是最近版本:6.2.3 下载后,解压,我解压到了D盘 (注意如果是6.2.3版本测试发现数据保存失败,我后来更换成了5.2.0版本,根据保存成功)
打开cmd ,cd到 D:\elasticsearch-6.2.3文件夹下的bin目录,然后执行 elasticcsearch.bat
回车执行
【如果执行过程中报 Error occurred during initialization of VM
Could not reserve enough space for object heap 错误 】那么我们只要去D:\elasticsearch-6.2.3文件夹下的config文件夹下找到jvm.options 文件,将服务占用的堆栈空间改小点就行了:改法如下图
执行完毕后我们可以在本机浏览器中输入127.0.0.1:9200来检查 elasticsearch服务是否运行成功
【注意:执行完毕后这个cmd窗口不要关闭,关闭后服务就停止了】
看到以下情况则表示成功。(如果用IE浏览器打开的话可能弹出一个让你保存的Json文件,如果Json文件内容是如下的话也表示服务运行成功)
第三步:使用
以上服务器都搭建好了,下面就来演示怎么通过代码来连接这个 Elasticc Search服务器
SDK有很多中驱动,如: ElasticSearch.Net ,NEST , PlainElastic.Net 等都可以使用,这里就使用PlainElastic.Net
1> 在项目中 通过Nuget安装PlainElastic.Net
控制器中调用:
using PlainElastic.Net; using PlainElastic.Net.Serialization; using System; using System.Web.Mvc; namespace ElasticSearch.Controllers { public class HomeController : Controller { public ActionResult Index() { Person p1 = new Person(); p1.Id = 100698; p1.Age = 18; p1.Name = "林黛玉ere"; p1.Describe = "ee林黛玉与贾宝玉青春年少,有共同的理想志趣和叛逆精神而慢慢发展成爱情。绛珠还泪的神话赋予了林黛玉迷人的诗人气质,为宝黛爱情注入了带有奇幻元素的罗曼蒂克色彩,同时又定下了悲剧基调。"; try { ElasticConnection client = new ElasticConnection("127.0.0.1", 9200); var serializer = new JsonNetSerializer(); //第一个参数相当于“数据库”,第二个参数相当于“表”,第三个参数相当于“主键” IndexCommand cmd = new IndexCommand("yzk", "persons", p1.Id.ToString()); //Put()第二个参数是要插入的数据 OperationResult result = client.Put(cmd, serializer.Serialize(p1)); var indexResult = serializer.ToIndexResult(result.Result); if (indexResult.created) { return Content("创建成功"); } else { return Content("没创建" + indexResult.error); } } catch (Exception ex) { string msg = ex.Message; throw ex; } //如何知道插入成功?看 indexResult 返回值。如果 id 已经存在,则不再插入,如果想覆盖 update 的话,就要先删再插。 } } public class Person { public int Id { get; set; } public int Age { get; set; } public string Name { get; set; } public string Describe { get; set; } } }