前言:
前段時間在項目中使用了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