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
-
(安裝Java)ElasticSearch(ES) 是基於 Lucene 的封裝。所以想要執行ES 需要安裝Java的JDK。這裡推薦安裝Java8,171的版本,安裝完成後可在cmd下檢視 java 和 javac 的版本資訊,java -version
-
(安裝ES)接下來去官網下載ES的安裝包即可,官網提供zip,msi 兩種安裝方式。zip 方式相對較簡潔。msi 操作簡單。
-
(安裝常用外掛)ES常用的外掛有ik分詞器,在官網下載好zip包,直接解壓縮到ES的安裝目錄下的plugins資料夾下即可,我的安裝路徑如下:E:\elasticsearch-6.2.4\plugins。安裝完成後需要重啟ES。
-
(安裝視覺化工具)這裡推薦安裝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);
}
設定訪問密碼
- 安裝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,其他不變。