天天看點

.net Elasticsearch 學習入門筆記

一. es安裝相關

1.elasticsearch安裝

  運作http://localhost:9200/

2.head插件

3.bigdesk插件安裝

(安裝細節百度:windows elasticsearch 安裝,有詳細内容)

二. es插件相關

http://www.searchtech.pro/elasticsearch-plugins (es 插件大全)

https://github.com/medcl/elasticsearch-analysis-ik (ik 項目)

https://github.com/lmenezes/elasticsearch-kopf (ES的插件  監控 節點狀态 , 也可以調試你的ES查詢)

https://github.com/medcl/elasticsearch-rtf/tree/master (2.1.1 + 1.6ik  還有拼音  和其他分詞器 內建好了)

https://github.com/lmenezes/elasticsearch-kopf (類似head的插件)

https://www.elastic.co/downloads/marvel (監控ES健康狀态)

konf插件 (據說能看叢集負載)

三.es C# 用戶端示例

1. 包下載下傳elasticsearch.net,nest 元件。

   nest元件會依賴下載下傳elasticsearch元件。

   使用文檔:http://nest.azurewebsites.net/

   備注:.net 使用es的相對少一些,es版本更新也很快,很多使用也都是靠自己揣摩。多交流,多分享。

2. 建立連接配接用戶端

     public ElasticClient GetClient()

        {

            var node = new Uri("http://192.168.17.54:9200");

            var settings = new ConnectionSettings(

                node,

                defaultIndex: "my-application"

            );

            return new ElasticClient(settings);

        }

3. 建立索引模型(索引結構)

[ElasticType(IdProperty = "Id", Name = "Person")]

        public class Person

           [ElasticProperty(Name = "Id", Type = FieldType.String, Index = FieldIndexOption.NotAnalyzed)]

            public string Id { get; set; }

            public string Firstname { get; set; }

            public string Lastname { get; set; }

            public string[] Chains { get; set; }

           [ElasticProperty(Name = "content", Type = FieldType.String, Index =

FieldIndexOption.Analyzed, Analyzer = "ik_max_word")]

            public string Content { get; set; }

     備注:其他人提供的model示例,更詳細些,可下載下傳附件。

4. 索引内容(建立索引)

  private void btnIndex_Click(object sender, EventArgs e)

            //var client = new ElasticsearchClient();

            ////index a document under /myindex/mytype/1

            //var indexResponse = client.Index("myindex", "mytype", "1", new { Hello = "World" });

            var client2 = GetClient();

            //client2.CreateIndex("test");

            //client2.Map<Person>(c => c.MapFromAttributes());

            IEnumerable<Person> persons = new List<Person>

            {

                new Person()

                {

                    Id = "4",

                    Firstname = "aaa",//Boterhuis-040

                    Lastname = "Gusto-040",

                    Chains = new string[]{ "a","b","c" },

                },

                    Id = "5",

                    Firstname = "[email protected]",

                    Lastname = "t Boterhuis 1",

                    Id = "6",

                    Firstname = "Aberdeen #110",

                    Lastname = "[email protected]",

                    Id = "7",

                    Lastname = "t Boterhuis 2",

                 new Person()

                    Id = "8",

            };

            //foreach(var p in persons)

            client2.IndexMany<Person>(persons,"test");

5. 簡單搜尋示例

  var client = GetClient();

            var rs = client.Search<Person>(s => s.Index("test").QueryString(this.textBox1.Text));

            this.richTextBox1.Text = JsonConvert.SerializeObject(rs.Documents);

6. 索引更新

 private void btnUpdate_Click(object sender, EventArgs e)

            client2.Update<Person, object>(u => u

             .Index("test")

            .Id(4)

            .Doc(new { Id="4", Firstname = "United States" })

            .RetryOnConflict(3)

            .Refresh()

           );

            //var u1 =  new Person()

            //    {

            //        Id = "4",

            //        Firstname = "Boterhuis-040",

            //        Lastname = "Gusto-040",

            //        Chains = new string[]{ "a","b","c" },

            //    };

            //var u2 = new Person()

            //        Firstname = "United States",

            //        Chains = new string[] { "a", "b", "c" },

            //client2.Update<Person,Person>(u1,u2).

7. 索引删除

 private void btnDelete_Click(object sender, EventArgs e)

            client2.DeleteIndex("test");

            client2.DeleteIndex("my-application");

8. 總結

以上示例代碼,簡單的應用已經足夠用。其他的就是高亮和分組。可以看文檔。

四. es 叢集

 es 預設是一個叢集,相對solr雲來說配置更簡單,搭建更友善些。但是更多還是要根據業務進行自己的叢集設計還是好費很多時間,很多精力。(上手容易,用好難)

五. es 與solr 對比

個人目前了解的:

原來solr資料比較多,現在貌似es的資料更多一點。solr是官方英文pdf,es也是英文的。

原來solr還有中文書籍,現在貌似沒有了。es 目前還有幾本書籍,但是講的es版本略有老舊。

solr上手相對es略微難些。

(n年前,我用的是solr,那時候還沒有solrcloud;es還沒有出來,那時候solr資料反而多。個人也實作了自己的solr叢集方案。其他的功能上的對比,還是百度,不重複。)

六. 如果es用戶端調試請求

建議下載下傳HTTPAnalyzer之類的tcp攔截工具。這樣可以攔截驗證sdk出來的請求連接配接,對比資料和書籍看下哪些參數寫錯了,對調試很有幫助。

七. es 附錄

es術語介紹:

cluster:

代表一個叢集,叢集中有多個節點,其中有一個為主節點。這個主節點是可以通過選舉産生的。注意,主從節點是對于叢集内部來說的。es的一個概念就是去中心

化,字面上了解就是無中心節點,這是對于叢集外部來說的,因為從外部來看es叢集,在邏輯上是個整體,你與任何一個節點的通信和與整個es叢集通信是等價

的。

shards

代表索引分片。es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜尋。分片的數量隻能在索引建立前指定,并且索引建立後不能更改。

replicas

代表索引副本,es可以設定多個索引的副本。副本的作用,一是提高系統的容錯性,當某個節點的某個分片損壞或丢失時可以從副本中恢複,二是提高es的查詢效率,es會自動對搜尋請求進行負載均衡。

recovery

代表資料恢複或叫資料重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新配置設定,挂掉的節點重新啟動時也會進行資料恢複。

river

代表es的一個資料源,也是其他存儲方式(如:資料庫)同步資料到es的一個方法。它是以插件方式存在的一個es服務,通過讀取river中的資料并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

gateway

代表es索引快照的存儲方式。es預設是先把索引存放到記憶體中,當記憶體滿了時再持久化到本地硬碟。gateway對索引快照進行存儲,當這個es叢集關閉再

重新啟動時,就會從gateway中讀取索引備份資料。es支援多種類型的gateway,有本地檔案系統(預設),分布式檔案系統,Hadoop的

HDFS和amazon的s3雲存儲服務。

discovery.zen

代表es的自動發現節點機制。es是一個基于p2p的系統,它先通過廣播尋找存在的節點,再通過多點傳播協定來進行節點之間的通信,同時也支援點對點的互動。

Transport

代表es内部節點或叢集與用戶端的互動方式。預設内部是使用tcp協定進行互動,同時它支援http協定(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協定(通過插件方式內建)。

繼續閱讀