ASP.NET Web API + Elasticsearch 6.x 快速做个全文搜索

时间:2023-03-09 13:33:08
ASP.NET Web API + Elasticsearch 6.x 快速做个全文搜索

最近想做个全文搜索,设想用 ASP.NET Web API + Elasticsearch 6.x 来实现。

网上搜了下 Elasticsearch 的资料,大部分是讲 linux 平台下如何用 java 来开发,有少量讲在 windows 平台下用 c# 开发的,且版本是 Elasticsearch 5.x 。无奈上官网撸串,这里梳理下官网的教程,希望对大家有所帮助。

一、Elasticsearch 的安装

下载  MSI(https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.msi)安装文件,完成后双击安装,点下一步,全部默认设置。

二、运行 Elasticsearch

打开 cmd,输入

cd %PROGRAMFILES%\Elastic\Elasticsearch\bin

回车,输入

.\elasticsearch.exe

回车

三、开发环境搭建

1、新建一个 webApi 工程

2、安装 NEST,用来连接 Elasticsearch

打开 NuGet 包管理器控制台,输入以下命令

Install-Package NEST -Version 6.0.

注意安装时带上版本号,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 = ; i < ;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()
.Size()
.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/中

一个简单的全文索引服务就完成了!