ElastciSearch簡單總結(筆記)


前言:

  前段時間在項目中使用了es,作為一個當前比較流行的分布式搜索引擎,在學習和使用它的過程中,踩了不少坑,這篇文章先簡單整理了一下,后續會整理一下之前踩過的一些坑。 

1. ElastciSearch是什么

  ElasticSearch是一個基於Apache Lucene的開源搜索引擎。它不僅僅是Lucene和全文搜索,我們還能這樣去描述他:

    • 分布式的實時文件存儲,每個字段都被索引並可被搜索
    • 分布式的實時搜索引擎
    • 可以擴展到上百台服務器

2. ElasticSearch的安裝與配置

  安裝方法網上很多,http://blog.csdn.net/whxaing2011/article/details/18237733

  配置:elasticsearch.yml

3. 與ElasticSearch的交互

  ElasticSearch提供多種語言的客戶端API,詳見

  ElasticSearcg為.NET用戶提供了三種客戶端, 

  • ElasticSearch.NET

    一個非常底層且靈活的客戶端

  • NEST

    ElasticSearch的官方客戶端,具有非常簡潔的API。可以映射所有請求和響應對象,擁有一個強類型查詢DSL。依賴ElasticSearch.NET客戶端。

  • PlainElastic.Net

    PlainElastic.net是一個Github開源項目。關於它和ElasticSearch.NET/NEST的活躍度對比

4. 面向文檔

  ElasticSearch是面向文檔的,在ES中可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。這種理解數據的方式和以往關系型數據庫不同,這也是ES能夠執行復雜的全文搜索的原因之一。

5. 對索引的理解

  在ElasticSearch中存儲數據的行為就叫做索引(Index),前面所說的文檔歸屬於不同種類型(Type),而這些類型存在於索引。

  數據庫->表->行->列  對應es中 索引->類型->文檔->字段

  索引的創建

  語法:

PUT /indextest/people/1
{
    "name":"張三",
    "age": 25,
    "sex": "",
    "interests":["體育", "音樂"]
}               

  通過HTTP的GET方法來檢索文檔,同樣的,可以通過DELETE方法來刪除文檔,如果想要更新就在PUT一次。

6. 搜索

        語法:GET /indextest/people/1

     DELETE /indextest /people/1

    簡單搜索

  搜索全部的病人信息 

    語法:GET /elasticsearch1/patient/_search

  這里,我們在結尾使用關鍵字_search來取代原來的文檔ID。返回的結果中hits數組中包含了我們所有的文檔。

     接下來,讓我們搜索年齡大於35的患者

          GET /elasticsearch1/patient/_search?q=Pat_Age:>35

       這種方法叫做查詢字符串(query string)搜索,像傳遞URL參數一樣傳遞語句

    使用DSL語句查詢

  查詢字符串搜索有局限性,ES還提供了豐富靈活的查詢語言叫做DSL查詢,它可以構建更加復雜強大的查詢。DSL以JSON請求體的形式出現。

GET /elasticsearch1/patient/_search
{
    "query" : {
        "range" : {
            "Pat_Age" : {
              "gt": 35
           }
        }
    }
}

  更復雜的查詢

GET /elasticsearch1/patient/_search
{
    "query" : {
        "bool": {
            "must": [
               {
                   "term": {
                      "Pat_Marital": {
                         "value": "已婚"
                      }
                   }
               },
               {
                   "range" : {
                        "Pat_Age" : {
                          "gt": 35
                       }
                   }
               }
            ]
        }
    }
}

     加過濾器

GET /elasticsearch1/patient/_search
{
    "query" : {
        "filtered": {
           "query": {
                   "bool": {
                    "must": [
                       {
                           "term": {
                              "Pat_Marital": {
                                 "value": "已婚"
                              }
                           }
                       },
                       {
                           "range" : {
                                "Pat_Age" : {
                                  "gt": 35
                               }
                           }
                       }
                    ]
                }
           },
           "filter": {
               "term": {
                  "Pat_Gender": "男"
               }
           }
        }
    }
}

  ElasticSearch也提供了這種特殊的緩存,filter cache來存儲filters得到的結果集。此外,緩存filters不需要太多的內存(它只保留一種信息,即哪些文檔與filter相匹配),同時它可以由其它的查詢復用,極大地提升了查詢的性能。

  並非所有的filters都會緩存,默認情況下,如下的filters不會被緩存:

Query查詢對象會將所有的條件綁定到一起存儲到緩存中,只要有一個條件改變就不能重用。

    全文搜索

  接下來介紹全文搜索—一種傳統數據庫不好實現的搜索

     如搜索所有得糖尿病又得高血壓的病人

GET /patientcase/patientcase/_search
{
    "query" : {
        "match" : {
            "Case_HDSD00_11_076" : "高血壓糖尿病"
        }
    }
}

  如下,用<em></em>來標識匹配到的單詞高亮

GET /patientcase/patientcase/_search
{
    "query" : {
        "match" : {
            "Case_HDSD00_11_076" : "高血壓糖尿病"
        }
    },
    "highlight": {
        "fields" : {
            "Case_HDSD00_11_076" : {}
        }
    }
}

    query_string

  參數:

          這里只挑幾個常用的參數說一下,其他的一般默認就夠了

          query:需要查詢的具體內容

          default_field:查詢的字段

     default_operator:默認運算符

GET /patientcase/patientcase/_search
{
    "query" : {
        "query_string":{
            "default_field":"name",
            "query":"張*"
        }
    }
}

    聚合

  ES可以通過聚合做一些分析統計

GET /elasticsearch1/patient/_search
{
    "filter": {
        "has_child": {
           "type": "adm",
           "query": {
               "term": {
                  "Adm_AdmDiagnos": {
                     "value": "高血壓"
                  }
               }
           }
        }
    },
    "aggs" : {
        "avg_age" : {
            "terms" : { "field" : "Pat_Gender" }
        }
    }
}

  相關資料:

      Mastering Elasticsearch(中文版)  http://udn.yyuap.com/doc/mastering-elasticsearch/index.html

      ElasticSearch權威中文版  https://es.xiaoleilu.com/

   ElasticSearch英文API  https://www.elastic.co/guide/en/elasticsearch/client/index.html

      ES相關插件  http://www.cnblogs.com/huangfox/p/3541300.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM