.net Elasticsearch 學習入門筆記

一. es安裝相關
1.elasticsearch安裝
  運行http://localhost:9200/
2.head插件
3.bigdesk插件安裝
(安裝細節百度:windows elasticsearch 安裝,有詳細內容)node

二. 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插件 (聽說能看集羣負載)git

三.es C# 客戶端示例 github

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" },
                },
                new Person()
                {
                    Id = "5",
                    Firstname = "sales@historichousehotels.com",
                    Lastname = "t Boterhuis 1",
                    Chains = new string[]{ "a","b","c" },
                },
                new Person()
                {
                    Id = "6",
                    Firstname = "Aberdeen #110",
                    Lastname = "sales@historichousehotels.com",
                    Chains = new string[]{ "a","b","c" },
                },
                new Person()
                {
                    Id = "7",
                    Firstname = "Aberdeen #110",
                    Lastname = "t Boterhuis 2",
                    Chains = new string[]{ "a","b","c" },
                },
                 new Person()
                {
                    Id = "8",
                    Firstname = "Aberdeen #110",
                    Lastname = "t Boterhuis 2",
                    Chains = new string[]{ "a","b","c" },
                },
            };
            //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)
        {
            var client2 = GetClient();

            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()
            //    {
            //        Id = "4",
            //        Firstname = "United States",
            //        Lastname = "Gusto-040",
            //        Chains = new string[] { "a", "b", "c" },
            //    };
            //client2.Update<Person,Person>(u1,u2).
        }

7. 索引刪除
 private void btnDelete_Click(object sender, EventArgs e)
        {
            var client2 = GetClient();
            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等的傳輸協議(經過插件方式集成)。web

相關文章
相關標籤/搜索