elasticsearch的一個最為顯著的優點:快速全文檢索。關於elasticsearch 全文檢索的原理,請看:https://blog.csdn.net/wolfcode_cn/article/details/81907195
一、es 安裝
參考官網安裝教程:https://www.elastic.co/guide/en/elasticsearch/reference/6.6/zip-targz.html
教程中介紹了多種操作系統多種安裝方式:
本篇選擇的是linux操作系統下,手動下載安裝包的方式安裝:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz.sha512 shasum -a 512 -c elasticsearch-6.6.2.tar.gz.sha512 tar -xzf elasticsearch-6.6.2.tar.gz cd elasticsearch-6.6.2/
安裝完畢之后,測試是否成功:
./bin/elasticsearch
此開啟方式是前台開啟,如果要后台運行
./bin/elasticsearch &
curl -X GET "localhost:9200/"
得到下面的信息:
下面設置在守護進程中運行,開機可以自啟動es:
[program:elasticsearch] command=/home/shippingadmin/elasticsearch-6.6.2/bin/elasticsearch startsecs=10 autostart=true autorestart=true stderr_logfile=/var/log/applogs/elasticsearch.err.log stdout_logfile=/var/log/applogs/elasticsearch.out.log user=shippingadmin stopsignal=INT
二、es 數據庫操作
引入 nuget 包
Install-Package NEST
連接es代碼:
public static ElasticClient Client; /// <summary> /// 初始化es連接 /// </summary> public static void Init() { //單節點 var node = new Uri("http://192.168.1.23:8920"); //指定默認索引是可選的,但如果沒有為給定請求推斷索引,NEST可能會引發異常,這里的默認索引是skuindex var settings = new ConnectionSettings(node) .DefaultMappingFor<Sku>(m => m.IndexName("skuitem")); //使用與群集中的三個Elasticsearch節點的地址對接的SniffingConnectionPool,並且客戶端將使用此類型的池來維護可以以循環方式發送請求的群集中的可用節點列表 //var uris = new[] //{ // new Uri("http://localhost:9200"), // new Uri("http://localhost:9201"), // new Uri("http://localhost:9202"), //}; //var connectionPool = new SniffingConnectionPool(uris); //var settings = new ConnectionSettings(connectionPool) // .DefaultMappingFor<Sku>(m => m.IndexName("SKU")); Client = new ElasticClient(settings);
創建索引:
/// <summary> /// 創建索引,並建立POCO映射關系,這在es第一次插入sku數據時,是必要的,重復插入並不會報錯 /// </summary> /// <returns></returns> public static bool CreateIndex() { var createIndexResponse = Client.CreateIndex("skuitem", c => c .Mappings(ms => ms .Map<Sku>(m => m.AutoMap()) ) ); return createIndexResponse.IsValid; }
定義Entity:
[ElasticsearchType(IdProperty = "Id")] public class Sku { public System.Guid Id { get; set; } [Keyword] public string Code { get; set; } [Keyword] public string SerialNumber { get; set; } public List<ItemTitle> SearchTitles { get; set; } } public class ItemTitle { public Guid Id { get; set; } [Keyword] public string Title { get; set; } [Keyword] public string CultureCode { get; set; } }
插入數據,並做查詢:
static void Main(string[] args) { SkuManager.Init(); SkuManager.CreateIndex(); List<Sku> skus = new List<Sku>() { new Sku() { Id=Guid.NewGuid(), Code="sku1", SerialNumber="abc1234", SearchTitles=new List<ItemTitle>() { new ItemTitle() { Id=Guid.NewGuid(), CultureCode="cn", Title="ddkdkdkdkdkdkdk", }, new ItemTitle() { Id=Guid.NewGuid(), CultureCode="en", Title="ddkdkdkdkdkdkdk", } } }, new Sku() { Id=Guid.NewGuid(), Code="sku2", SerialNumber="abc1dddfd234", SearchTitles=new List<ItemTitle>() { new ItemTitle() { Id=Guid.NewGuid(), CultureCode="cn", Title="ddkdkdkdkdkdksdfsdk", }, new ItemTitle() { Id=Guid.NewGuid(), CultureCode="en", Title="ddkdkdksdfdkdkdkdk", } } } }; var indexResult = SkuManager.Client.IndexMany<Sku>(skus); var searchResult1 = SkuManager.Client.Search<Sku>(s => s .From(0) .Size(5) .Query(q => q .Match(m => m .Field(f => f.SerialNumber) .Query("fd") ) ) ); var query = new List<Func<QueryContainerDescriptor<Sku>, QueryContainer>>(); query.Add(sku => sku.Wildcard(tm => tm.Field(f => f.SerialNumber).Value("*fd*"))); query.Add(sku => sku.Term(tm => tm.Field(f => f.Code).Value("sku2"))); var searchResult2 = SkuManager.Client.Search<Sku>(s => s .Query(q => q.Bool(b => b.Must(query)) ) ).Documents.ToList(); }
總結:1.es是用java代碼編寫的數據存儲以及提供了豐富的數據操作API,所以在windows或者linux安裝es之前,是需要先安裝java sdk,並設置環境變量;關於環境變量的文章請參考:
https://www.cnblogs.com/jasonzeng/p/8302171.html
https://blog.csdn.net/u012498149/article/details/78771729
2.es相對應的客戶端是 kibana,提供了強大的數據查詢,圖表,統計等功能,后面可能要針對 kibana作一次學習總結;
3.現在es最新版本,7.x已經出來,安裝完之后,用elasticsearch.net,是不兼容的,因為elasticsearch.net,只支持到 6.x版本;
4.關於elasticsearch.net,更多的數據庫操作,請看官網,其中有low lever client, high lever client, 本篇用的是high level client: https://www.elastic.co/guide/en/elasticsearch/client/net-api/6.x/nest.html