前言:
前段时间在项目中使用了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" : "高血压糖尿病" } } }
如下,用来标识匹配到的单词高亮
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