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