最近想做個全文搜索,設想用 ASP.NET Web API + Elasticsearch 6.x 來實現。
網上搜了下 Elasticsearch 的資料,大部分是講 linux 平臺下如何用 java 來開發,有少量講在 windows 平臺下用 c# 開發的,且版本是 Elasticsearch 5.x 。無奈上官網擼串,這裏梳理下官網的教程,希望對大家有所幫助。
一、Elasticsearch 的安裝
下載 MSI 安裝文件,完成後雙擊安裝,點下一步,全部默認設置。
二、運行 Elasticsearch
打開 cmd,輸入
cd %PROGRAMFILES%\Elastic\Elasticsearch\bin
回車,輸入
.\elasticsearch.exe
回車
三、開發環境搭建
1、新建一個 webApi 工程
2、安裝 NEST,用來連接 Elasticsearch
打開 NuGet 包管理器控制檯,輸入以下命令
Install-Package NEST -Version 6.0.1
注意安裝時帶上版本號,NEST 與 Elasticsearch 版本對應,這是個坑。
3、連接 Elasticsearch
新建一個連接類 ClientHelper.cs
public class ClientHelper
{
private static ClientHelper clientHelper = null;
// 默認索引
public static string DEFAULT_INDEX = "resource";
private ElasticClient Client()
{
var nodes = new Uri[]
{
new Uri("http://127.0.0.1:9200")
};
var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool)
.DefaultIndex(DEFAULT_INDEX)
.PrettyJson();
//.BasicAuthentication("elastic", "changeme");
return new ElasticClient(settings);
}
public static ElasticClient getInstance()
{
if(clientHelper==null){
clientHelper = new ClientHelper();
}
return clientHelper.Client();
}
}
新建映射類 Resource.cs
[ElasticsearchType(Name = "resource", IdProperty = "ID")]
public class Resource
{
[Keyword(Name = "id")]
public string ID { get; set; }
[Text(Name = "name")]
public string NAME { get; set; }
}
4、增刪查改操作
新建一個 api 控制器 ESController.cs
public class ESController : ApiController
{
// GET: api/ES/1
// 按 id 查詢單條記錄
public Resource Get(string id)
{
var client = ClientHelper.getInstance();
var response = client.Get<Resource>(id, idx => idx.Index(ClientHelper.DEFAULT_INDEX));
return response.Source;
}
// POST api/ES
// 批量導入數據庫數據
public string Post()
{
using (DataContext db = new DataContext())
{
var client = ClientHelper.getInstance();
List<Demo> items= db.demo.ToList();
for (int i = 0; i < 100;i++ )
{
var item = items[i];
Resource mod = new Resource();
mod.ID = item.ID;
mod.NAME = item.NAME;
client.Index<Resource>(mod, idx => idx.Index(ClientHelper.DEFAULT_INDEX));
}
}
return "OK";
}
// PUT api/ES/5
// 按 id 更新單條數據
public Result Put(string id)
{
var client = ClientHelper.getInstance();
var response = client.Update<Resource>(id, idx => idx.Index(ClientHelper.DEFAULT_INDEX));
return response.Result;
}
// DELETE api/ES/5
// 按 id 刪除單條數據
public Result Delete(string id)
{
var client = ClientHelper.getInstance();
var response = client.Delete<Resource>(id, idx => idx.Index(ClientHelper.DEFAULT_INDEX));
return response.Result;
}
}
另新建一個api 控制器 SearchController.cs 用來提供搜索服務
public class SearchController : ApiController
{
// GET: api/Search/
public List<IHit<Resource>> Get(string id)
{
var client = ClientHelper.getInstance();
var modList = client.Search<Resource>(s => s
.From(0)
.Size(10)
.Query(q => q.Term(t => t.NAME, id))
);
return modList.Hits.ToList();
}
}
5、試一試
(1) 導入數據到 Elasticsearch
POST http://localhost:8389/api/es
(2) 查詢 id 爲 1 的記錄
GET http://localhost:8389/api/es/1
(3) 更新 id 爲 1 的記錄
PUT http://localhost:8389/api/es/1
(4) 刪除 id 爲 1 的記錄
DELETE http://localhost:8389/api/es/1
(5) 查詢名字中帶有 中 的記錄
GET http://localhost:8389/api/Search/中
一個簡單的全文索引服務就完成了!