ES简介
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
历史
多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。
直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做 “Compass” 。
后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。
第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。
Shay的妻子依旧等待着她的食谱搜索……
ES vs. RDB
Elasticsearch -> 索引(index)->类型(type)->文档(doc.)->字段(field)
Relational DB -> 数据库 ->表 -> 行 -> 列
RESTful API
GET /_search { "query": { "match_all": {} } } PUT /test/employee/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] } DELETE /index DELETE /pre_*
简单的搜索
URL形式: http://localhost:9200/test/_search?q=-about:love http://localhost:9200/test/_search?q=collect|build http://localhost:9200/test/_search?q=age:>30 DSL形式: GET /test/employee/_search { "query": { "match": { "last_name": "smith" } } }
返回结果
took:耗时 shards:分片 hits:命中(结果) _score:评分 _source:文档
稍复杂的搜索
GET /test/employee/_search { "query" : { "filtered" : { "filter" : { "range" : { "age" : { "gt" : 30 } } }, "query" : { "match" : { "last_name" : "smith" } } } } }
匹配方式
- match(全文搜索)
- match_phrase(短语搜索)
- term(精确匹配)
- range(范围)
- exists & missing(存在&不存在)
match:全文搜索
GET /test/employee/_search { "query" : { "match" : { "about" : "rock climbing" } } }
match_phrases:短语搜索
GET /test/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } } }
term:精确匹配
GET /test/employee/_search { "query" : { "term" : { "age" : 25 } } }
range:区间匹配
GET /test/employee/_search { "query" : { "range": { "age": { "gte": 20, "lt": 30 } } } }
bool:逻辑组合
GET /test/employee/_search { "query" : { "bool": { "should": [ { "bool":{ "must": { "match": { "about": "rock" }}, "must_not": { "range": { "age": {"lt":30}}} } }, { "term": { "first_name": "john" }} ] } } }
- must:: (AND)查询指定文档一定要被包含。
- must_not:: (NOT)查询指定文档一定不要被包含。
- should:: (OR)查询指定文档,有则可以为文档相关性加分。
filter过滤
过滤与匹配似乎功能类似,事实上将过滤条件写入query语句中也可以得到同等的结果集。区别是query中的条件会影响评分,而filter中的条件只做过滤,不影响评分和排序。
GET /_search { "query": { "filtered": { "query": {"match": {"about": "rock"}}, "filter": { "range": { "age": {"gt":30} }} } } }
aggs:聚合
GET /megacorp/employee/_search { "aggs": { "all_interests": { "terms": { "field": "interests" } } } }
GET /test/employee/_search { "query": { "match": { "last_name": "smith" } }, "aggs": { "all_interests": { "terms": { "field": "interests" } } } }
highlight匹配高亮
GET /test/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } }, "highlight": { "fields" : {"about" : {}} } }
from,size:分页查询
GET /test/employee/_search { "query": { "match": { "last_name": "smith" } }, "from": 1, "size": 2 }