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

最近想做个全文搜索,设想用 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/中

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值