1. 程式人生 > 實用技巧 >ElasticSearch 6.2.4實踐

ElasticSearch 6.2.4實踐

參考資料

ElasticSearch 官網
ElasticSearch,Kibana,Asp.net Core with docker 示例
阮一峰 ElasticSearch
ElasticSearch Nest
生產環境elasticsearch的配置建議

基礎概念

索引(index)是ElasticSearch存放資料的地方。對應關係型資料庫中的一張表。索引名稱需小寫。

文件(document)是ElasticSearch中儲存的主要實體。對應關係型資料庫中的資料表的一行資料。文件由欄位(行資料的列)組成,一個欄位可以出現多次,該欄位被稱為多值欄位。每個欄位對應一種型別。

文件型別,在ElasticSearch中一個索引可以儲存許多不同用途的物件。

節點和叢集,ElasticSearch可以作為一個獨立的搜尋伺服器工作,也支援在在多臺協同工作的伺服器上執行。這些伺服器被統稱為一個叢集(cluster)。叢集的每個伺服器則被稱為一個節點(node)。

分片:將資料切分,每部分是一個單獨的Apache Lucene索引。每個分片可以儲存在叢集的不同節點上。

副本分片:副本分片是對原始分片的一個精確拷貝,原始分片被稱為主分片。對索引的所有修改操作都直接作用在主分片上,每個主分片可以有零個或多個副本分片。

安裝

Windows

  1. (安裝Java)ElasticSearch(ES) 是基於 Lucene 的封裝。所以想要執行ES 需要安裝Java的JDK。這裡推薦安裝Java8,171的版本,安裝完成後可在cmd下檢視 java 和 javac 的版本資訊,java -version

    javac -version ,能正常返回版本資訊即是安裝成功。Tips:這裡需要提前配置好Java的環境變數。可參考 百度經驗-Windows 10 配置Java環境變數

  2. (安裝ES)接下來去官網下載ES的安裝包即可,官網提供zip,msi 兩種安裝方式。zip 方式相對較簡潔。msi 操作簡單。

  3. (安裝常用外掛)ES常用的外掛有ik分詞器,在官網下載好zip包,直接解壓縮到ES的安裝目錄下的plugins資料夾下即可,我的安裝路徑如下:E:\elasticsearch-6.2.4\plugins。安裝完成後需要重啟ES。

  4. (安裝視覺化工具)這裡推薦安裝Kibana,安裝和ES對應的版本即可。還有一種是ES的Head外掛。

.NET Core 實現

ElasticSearch官方提供兩個nuget包(**ElasticSearch.Net NEST )實現ElasticSearch 的功能。都已支援.net core **專案。以下是關於這兩個包的介紹:

  • Elasticsearch.Net provides a low-level API for connecting with Elasticsearch and leaves to you the work of building/processing the requests and responses. It is a very thin client for consuming the HTTP API from .Net

  • NEST sits on top of Elasticsearch.Net and provides a higher-level API. It can map your objects to/from Request/Responses, make assumptions about index names, document types, field types and provide a strongly typed language for building your queries that matches the one of the HTTP REST API

建立索引

預設索引:

var settings = new ConnectionSettings(new Uri("http://example.com:9200"))
    .DefaultIndex("people");
var client = new ElasticClient(settings);

指定索引:這裡的關鍵是需要Mapping

var settings = new ConnectionSettings(new Uri("http://example.com:9200"));
var client = new ElasticClient(settings);

client.CreateIndex(_indexName, i => i.Mappings(m => m.Map<T>(s => s.AutoMap())));

POCO

[ElasticsearchType(IdProperty = "ProductId",Name ="product")] 
public class ProductDoc
    {
        public int ProductId { get; set; }
        
        public int BrandId { get; set; }

        public int? BrandCollectionId { get; set; }

        [Text(Analyzer = "ik_smart", SearchAnalyzer = "ik_smart")]
        public string PrimaryName { get; set; }

        [Keyword(Index = true)]
        public string BrandNameKeyword { get; set; }

        [Text(Analyzer = "ik_smart", SearchAnalyzer = "ik_smart")]
        public string BrandName { get; set; }
    }

需要注意的是,在建立一個POCO 物件的時候,ElasticsearchType的Name是必須指定的。[Text],[Keyword]都是用來標註該屬性需要以什麼方式來搜尋或者建立。
其中"ik_smart" 依賴於 ES 的 **ik **這個外掛包,是一箇中文分詞外掛。

查詢

public SearchResponse<ProductDoc> SearchByKeyword(ProductRequest request)
        {
            var matchFields = new string[] { "primaryName^3", "brandName^2", "tagNames^1.5", "brandCollectionName^1.5" ,"details" };
            var query = new QueryContainer(new BoolQuery
            {
                Must = new List<QueryContainer>
                        {
                            new MultiMatchQuery
                            {
                             Fields=matchFields,
                             Query=request.KeyWord,
                             Operator=0
                            }
                        }
            });

            var filters = new List<IQueryContainer>();
            if (request.CategoryNames != null)
            {
                var filterBuilderCatgory= new QueryContainer();
                List<string> cateterms = new List<string>();
                foreach (var c in request.CategoryNames)
                {
                    cateterms.Add(c);
                }
                filterBuilderCatgory = new QueryContainer(
                     new BoolQuery
                     {
                         Filter = new List<QueryContainer>
                         {
                           new TermsQuery
                           {
                               Field="topCategoryName",
                               Terms=cateterms
                           }
                         }
                     }
                );
                filters.Add(filterBuilderCatgory);
            }
            if (request.BrandNames != null)
            {
                var filterBuilderBrand = new QueryContainer();
                List<string> brandterms = new List<string>();
                foreach (var c in request.BrandNames)
                {        
                    brandterms.Add(c);
                }
                filterBuilderBrand = new QueryContainer(
                     new BoolQuery
                     {
                         Filter = new List<QueryContainer>
                         {
                           new TermsQuery
                           {
                               Field="brandNameKeyword",
                               Terms=brandterms
                           }
                         }
                     }
                 );
                filters.Add(filterBuilderBrand);
            }

            AggregationContainerDescriptor<ProductDoc> aggregation = null;
            aggregation = new AggregationContainerDescriptor<ProductDoc>()
              .Terms("agg_brand", f => f.Field(t=>t.BrandNameKeyword))
              .Terms("agg_topcategory", f => f.Field(t=>t.TopCategoryName));

            var result = client.SetPageNum(request.PageNum).SetPageSize(request.PageSize).Search(query, filters, a=> aggregation);
            return client.FormatResult(result);
        }

設定訪問密碼

  1. 安裝x-pack

生產環境部署

設定外網訪問

關閉防火牆,設定出站埠(9200),修改配置檔案項 network.host

設定為Windows服務

進入ElasticSearch 的bin 目錄執行elasticsearch-service.bat install
按住windows+R 鍵 輸入services.msc 進去服務面板設定自動啟動項

更新license授權檔案

Windows 下可使用postman進行提交

申請license

官網申請地址:license 申請地址,選擇自己對應的版本就可以了,證書有效期為1年,下載下來是一個json檔案。P.S:6.3版本以上的ES不需要更新證書。

提交license

1.postman 中輸入URL:localhost:9200/_license,請求方式為“PUT”,如果有使用到密碼登入的,在[Authorization]選項卡中“type”選擇 “Basic Auth”,輸入自己的使用者名稱和密碼。[Body] 選項卡中選擇 "Raw"-"JSON"。提交即可。

2.第一步返回200的狀態碼代表成功,這時候會讓你新增一個引數[acknowledge=true]再提交一次以便確認。URL為:localhost:9200/_license?acknowledge=true,其他不變。