使用NEST調用ElasticSearch


前言

ElasticSearch(以后簡稱ES)是一個穩定可靠快速的分布式文檔存儲(內存+本地持久化)和搜索引擎

本文使用.NetCore3.1調用ES作為示例。ES的.NET SDK采用NEST

注意:ES版本與NEST版本需要匹配,否則會造成”Invalid NEST response built from a unsuccessful () low level call on POST“。示例使用elasticsearch:7.16.1+NEST:7.17.0

ElasticSearch安裝部署

# ElasticSearch安裝手冊

## 拉取鏡像
```
docker pull elasticsearch:7.16.1
```
## 創建本地映射
```
mkdir -p /elasticsearch/data
chmod -R 777 /elasticsearch/data
```
## 開啟容器
```
docker run --name es -p 9200:9200 -p 9300:9300  -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch:7.16.1
```
## 修改配置
```
docker exec -it es /bin/bash
ls
cd config
ls
vi elasticsearch.yml

# 加入跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

# 設置密碼(如果運行以下命令提示不成功,exit退出容器后restart再進入)
bin/elasticsearch-setup-passwords interactive
```
## 重啟容器
```
docker restart es
```

 

 .NETCORE3.1調用

1.Nuget中獲取NEST(v7.17.0)

2.appsettings.json中配置ES地址

"EsUrl": "http://192.168.1.10:9200/"

3.增加ES操作服務

IEsClientProvider.cs

using Nest;

namespace Elasticsearch.Service
{
    public interface IEsClientProvider
    {
        ElasticClient GetClient();
    }
}

EsClientProvider.cs

using Microsoft.Extensions.Configuration;
using Nest;
using System;

namespace Elasticsearch.Service
{
    public class EsClientProvider : IEsClientProvider
    {
        private readonly IConfiguration _configuration;
        private ElasticClient _client;
        public EsClientProvider(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        public ElasticClient GetClient()
        {
            if (_client != null)
                return _client;

            InitClient();
            return _client;
        }

        private void InitClient()
        {
            var node = new Uri(_configuration["EsUrl"]);
            _client = new ElasticClient(new ConnectionSettings(node).DefaultIndex("tracks"));
        }
    }
}

4.Startup.ConfigureServices中注冊服務

services.AddSingleton<IEsClientProvider, EsClientProvider>();

5.Controller中獲取注入的服務

using Elasticsearch.Service;
using Microsoft.AspNetCore.Mvc;
using Nest;
using System.Collections.Generic;

namespace Elasticsearch.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValueController : ControllerBase
    {
        private readonly ElasticClient _client;

        public ValueController(IEsClientProvider clientProvider)
        {
            _client = clientProvider.GetClient();
        }

        /// <summary>
        /// 提交數據
        /// </summary>
        /// <param name="post"></param>
        /// <returns></returns>
        [HttpPost("[action]")]
        public Post Submit(Post post)
        {
            IndexResponse res=_client.IndexDocument(post);
            if (res.IsValid)
            {
                return post;
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 查詢數據
        /// </summary>
        /// <param name="shipguid"></param>
        /// <returns></returns>
        [HttpGet("[action]")]
        public IReadOnlyCollection<Post> Search(string shipguid)
        {
            return _client.Search<Post>(s => s
                .From(0)
                .Size(10)
                .Query(q => q.Match(m => m.Field(f => f.shipGuid).Query(shipguid)))).Documents;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM