中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

.Net?Api中怎么使用Elasticsearch存儲文檔

發布時間:2022-01-25 15:10:08 來源:億速云 閱讀:111 作者:iii 欄目:開發技術

這篇文章主要介紹“.Net Api中怎么使用Elasticsearch存儲文檔”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“.Net Api中怎么使用Elasticsearch存儲文檔”文章能幫助大家解決問題。

什么是Elasticsearch?

Elasticsearch 是一個分布式、高擴展、高實時的搜索與數據分析引擎。它能很方便的使大量數據具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸縮性,能使數據在生產環境變得更有價值。Elasticsearch 的實現原理主要分為以下幾個步驟,首先用戶將數據提交到Elasticsearch 數據庫中,再通過分詞控制器去將對應的語句分詞,將其權重和分詞結果一并存入數據,當用戶搜索數據時候,再根據權重將結果排名,打分,再將返回結果呈現給用戶。

總之這個數據庫可以很靈活的對你存入的數據進行分詞并查詢,可以靈活的處理字段內容,篩選你想要的數據,更重要的是這個數據庫是分布式的,可以減少應為一個數據庫down掉而導致的數據丟失。

以下簡稱Elasticsearch為Es數據庫。前言 | Elasticsearch: 權威指南 | Elastic

用Nest使用Es數據庫

配置Nest

在C# 的環境中,有一個Es的官方拓展包Nest,可以讓我們方便快捷的使用上Es數據庫。首先在我們新建完項目后,需要在Nuget包管理中給項目安裝NEST包。

安裝完NEST包之后,需要新建一個Es的配置類EsConfig.cs,這里我們只使用最簡單的賬號,密碼和數據庫地址

 /// <summary>
    /// ES配置類
    /// </summary>
    public class EsConfig
    {
        /// <summary>
        /// 賬號
        /// </summary>
        public string username { get; set; }
        /// <summary>
        /// 密碼
        /// </summary>
        public string password { get; set; }
        /// <summary>
        /// ES地址
        /// </summary>
        public string url { get; set; }
    }

有了配置類之后,需要在程序啟動時,對Es進行配置。首先這里先新建一個Es客戶端的接口類IElasticsearchClient.cs

 /// <summary>
    /// ES客戶端
    /// </summary>
    public interface IElasticsearchClient
    {
        /// <summary>
        /// 獲取ElasticClient
        /// </summary>
        /// <returns></returns>
        ElasticClient GetClient();
        /// <summary>
        /// 指定index獲取ElasticClient
        /// </summary>
        /// <param name="indexName"></param>
        /// <returns></returns>
        ElasticClient GetClient(string indexName);
    }

在配置對該接口的實現類ElasticsearchClient.cs,在這個實現類中我們使用了IOptions的依賴注入的形式來對配置文件進行配置,這種模式通常適用于API類型項目的配置。

我們也可以使用直接_EsConfig = Configuration.GetSection("EsConfig").Get<EsConfig>();的形式來讀取配置文件進行配置

/// <summary>
    /// ES客戶端
    /// </summary>
    public class ElasticsearchClient : IElasticsearchClient
    {
        public EsConfig _EsConfig;
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="esConfig"></param>
        public ElasticsearchClient(IOptions<EsConfig> esConfig)
        {
            _EsConfig = esConfig.Value;
        }
        /// <summary>
        /// 獲取elastic client
        /// </summary>
        /// <returns></returns>
        public ElasticClient GetClient()
        {
            if (_EsConfig == null || _EsConfig.url == null || _EsConfig.url == "")
            {
                throw new Exception("urls can not be null");
            }
            return GetClient(_EsConfig.url, "");
        }
        /// <summary>
        /// 指定index獲取ElasticClient
        /// </summary>
        /// <param name="indexName"></param>
        /// <returns></returns>
        public ElasticClient GetClient(string indexName)
        {
            if (_EsConfig == null || _EsConfig.url == null || _EsConfig.url == "")
            {
                throw new Exception("urls can not be null");
            }
            return GetClient(_EsConfig.url, indexName);
        }
        /// <summary>
        /// 根據url獲取ElasticClient
        /// </summary>
        /// <param name="url"></param>
        /// <param name="defaultIndex"></param>
        /// <returns></returns>
        private ElasticClient GetClient(string url, string defaultIndex = "")
        {
            if (string.IsNullOrWhiteSpace(url))
            {
                throw new Exception("urls can not be null");
            }
            var uri = new Uri(url);
            var connectionSetting = new ConnectionSettings(uri);
            if (!string.IsNullOrWhiteSpace(url))
            {
                connectionSetting.DefaultIndex(defaultIndex);
            }
            connectionSetting.BasicAuthentication(_EsConfig.username, _EsConfig.password); //設置賬號密碼
            return new ElasticClient(connectionSetting);
        }
        /// <summary>
        /// 根據urls獲取ElasticClient
        /// </summary>
        /// <param name="urls"></param>
        /// <param name="defaultIndex"></param>
        /// <returns></returns>
        private ElasticClient GetClient(string[] urls, string defaultIndex = "")
        {
            if (urls == null || urls.Length < 1)
            {
                throw new Exception("urls can not be null");
            }
            var uris = urls.Select(p => new Uri(p)).ToArray();
            var connectionPool = new SniffingConnectionPool(uris);
            var connectionSetting = new ConnectionSettings(connectionPool);
            if (!string.IsNullOrWhiteSpace(defaultIndex))
            {
                connectionSetting.DefaultIndex(defaultIndex);
            }
            return new ElasticClient(connectionSetting);
        }
    }

既然是依賴注入別忘了在Startup.cs中對其進行注入。

services.Configure<EsConfig>(Configuration.GetSection("EsConfig"));

操作數據庫

平時在我們操作數據庫之前,我們通常會有一個“建庫”、“建表”等操作,在Es中我們可以理解為創建索引基礎入門 | Elasticsearch: 權威指南 | Elastic。

由于Es數據庫目前還沒有很好的IDE去管理它,我們通常使用代碼來實現表的創建,所以先新建一個Es的拓展類來創建表ElasticClientExtension.cs

 /// <summary>
    /// ElasticClient 擴展類
    /// </summary>
    public static class ElasticClientExtension
    {
        /// <summary>
        /// 創建索引
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="elasticClient"></param>
        /// <param name="indexName"></param>
        /// <param name="numberOfShards"></param>
        /// <param name="numberOfReplicas"></param>
        /// <returns></returns>
        public static bool CreateIndex<T>(this ElasticClient elasticClient, string indexName = "", int numberOfShards = 10, int numberOfReplicas = 1) where T : class
        {

            if (string.IsNullOrWhiteSpace(indexName))
            {
                indexName = typeof(T).Name;
            }

            if (elasticClient.Indices.Exists(indexName).Exists)
            {
                return false;
            }
            else
            {
                var indexState = new IndexState()
                {
                    Settings = new IndexSettings()
                    {
                        NumberOfReplicas = numberOfReplicas,
                        NumberOfShards = numberOfShards,
                    },
                };
                var response = elasticClient.Indices.Create(indexName, p => p.InitializeUsing(indexState).Map<T>(p => p.AutoMap()));
                return response.Acknowledged;
            }
        }
    }

然后就是需要創建我們針對索引的方法了,我使用的是一個索引新建一個方法,新建一個ElaticSearchBase.cs,在這里我們假設要創建一個叫XXX的索引,首先我們要定義好一個叫XXX的類,我這里新建了一個主鍵和一個xml字段,用來存儲xml的數據。然后我在ElaticSearchBase.cs新建一個專屬于連接XXX索引的客戶端Client_XXX,如果數據庫中存在xxx則直接連接,如果不存在則新建后連接。

  public class XXX
    {
        public int xid { get; set; }
        [Text(Name = "xml")]
        public string xml { get; set; }
    }
  public class ElaticSearchBase
    {

        private IElasticsearchClient _client;
        public ElaticSearchBase(IElasticsearchClient client)
        {
            _client = client;
        }
        /// <summary>
        /// XXX文檔索引
        /// </summary>
        public ElasticClient Client_XXX => GetXXX();

        private ElasticClient GetXXX()
        {
	    //如果數據庫中存在xxx則直接連接,如果不存在則新建后連接
            var client = _client.GetClient("XXX");
            if (!client.Indices.Exists("XXX").Exists)
            {
                client.CreateIndex<XXX>("XXX");
            }
            return client;
        }
    }

接下來我們到了實操部分:

新增

private ElaticSearchBase _es = new ElaticSearchBase(_client);
//實例化對象
var xxx1 = new XXX(){tempid = 1,xml = "xmlstring"};
//存儲xxx1
var res =_es.Client_XXX.IndexDocument(xxx1);
//獲得Es主鍵
var esid = res.Id;

查詢

var res = _es.Client_XXX.Get<XXX>(esid);

刪除

var res = _es.Client_XXX.Delete<XXX>(esid)

修改

//實例化對象
var xxx2 = new XXX(){tempid = 2,xml = "xmlstring2"};
var upRes= _es.Client_XXX.Update<XXX, object>(ex.xmlid, upt => upt.Doc(xxx2));

關于“.Net Api中怎么使用Elasticsearch存儲文檔”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

织金县| 林周县| 杭锦后旗| 乐清市| 寻乌县| 乌拉特后旗| 台北市| 神木县| 钟祥市| 新竹县| 莱西市| 永登县| 德保县| 克拉玛依市| 连平县| 富平县| 宜兰县| 姜堰市| 北海市| 民乐县| 尼木县| 临澧县| 陆良县| 习水县| 紫阳县| 乐业县| 隆昌县| 孝感市| 呼伦贝尔市| 河间市| 定结县| 长泰县| 承德县| 阳西县| 徐汇区| 元江| 齐河县| 象山县| 冀州市| 额济纳旗| 三亚市|