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/中

一個簡單的全文索引服務就完成了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章