花几分钟看一下Elasticsearch原理解析与性能调优

基本概念定义

  • 一个分布式的实时文档存储 , 每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展 , 并支持 PB 级别的结构化或者非结构化数据
用途
  • 全文检索
  • 结构化搜索
  • 分析
VS传统数据库
  • 传统数据库提供精确匹配
  • ES提供精确匹配全文检索处理同义词给文档相关性评分生成分析与聚合数据实时
专有名词
  • 索引(名词)类似于数据库
  • 索引(动词)类似于insert 。 例如索引一个文档到一个索引
  • 倒排索引默认每个属性都会有一个倒排索引 , 可以设置属性不被索引 , 它只能被覆盖 , 不能被修改
  • 类型类似表 , 同一索引的不同类型 , 可以拥有不同的字段 , 但应该拥有大部分相似的字段 。 它可以包含大小写 , 不能包含句号 , 不能以下划线开头 , 长度限制为256.
  • Id文档的id , 可以在生成文档时指定或自动生成 , 自动生成的ID , 在大部分情况下多个节点的时候唯一 。 如果在创建文档时 , ID冲突 , 服务器会返回409
  • 文档类似于记录 , 文档只能被替换 , 而不能被修改 , 文档的字段类型需要一致 , 否则无法进行精确匹配
  • 精确值字段对于数字 , 日期 , 布尔和一个not_analyzed字段 , 进行查询 , 会适用精确匹配
  • 全文搜索字段否则 , 进行相关性搜索
PUT /megacorp/employee/1{"first_name" : "John","last_name" :"Smith","age" :25,"about" :"I love to go rock climbing","interests": [ "sports", "music" ]}例如
  • megacorp是索引
  • employee是类型
  • 1是文档id
  • json内容是文档
交互RESTful APIcurl -X '://:/?' -d ''VERB适当的 HTTP 方法谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE 。 PROTOCOLhttp 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)HOSTElasticsearch 集群中任意节点的主机名 , 或者用 localhost 代表本地机器上的节点 。 PORT运行 Elasticsearch HTTP 服务的端口号 , 默认是 9200。 PATHAPI 的终端路径(例如 _count 将返回集群中文档数量) 。 Path 可能包含多个组件 , 例如:_cluster/stats 和 _nodes/stats/jvm。 QUERY_STRING任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值 , 使其更容易阅读)BODY一个 JSON 格式的请求体 (如果请求需要的话)
例子request:
curl -XGET 'http://localhost:9200/_count?pretty' -d '{"query": {"match_all": {}}}'response:
{"count" : 0,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0}}检索文档功能
  • 获取一个文档GET /megacorp/employee/1
  • 简单查询GET /megacorp/employee/_search #查询前十条记录 GET /megacorp/employee/_search?q=last_name:Smith #查询smith的前十条记录
  • 表达式查询GET /megacorp/employee/_search { "query" : { "match" : { "last_name" : "Smith" } } } GET /megacorp/employee/_search { "query" : { "bool": { "must": { "match" : { "last_name" : "smith" } }, "filter": { "range" : { "age" : { "gt" : 30 } } } } } }
  • 全文检索GET /megacorp/employee/_search { "query" : { "match" : { "about" : "rock climbing" } } }
  • 短语查询GET /megacorp/employee/_search { "query" : { "match_phrase" : { "about" : "rock climbing" } } }
  • 分析(类似于聚合group by)request:GET /megacorp/employee/_search { "aggs" : { "all_interests" : { "terms" : { "field" : "interests" }, "aggs" : { "avg_age" : { "avg" : { "field" : "age" } } } } } } response: ... "all_interests": { "buckets": [ { "key": "music", "doc_count": 2, "avg_age": { "value": 28.5 } }, { "key": "forestry", "doc_count": 1, "avg_age": { "value": 35 } }, { "key": "sports", "doc_count": 1, "avg_age": { "value": 25 } } ] }
  • 修改文档PUT /website/blog/123 { "title": "My first blog entry", "text": "I am starting to get the hang of this...", "date": "2014/01/02" } 旧文档不会马上删掉新文档会被索引文档的version会加一
  • 删除文档DELETE /megacorp/employee/123 文档的version依然会加一
分布式特性ES自动执行的分布式动作
  • 分配文档到不同的容器 或 分片 中 , 文档可以储存在一个或多个节点中
  • 按集群节点来均衡分配这些分片 , 从而对索引和搜索过程进行负载均衡
  • 复制每个分片以支持数据冗余 , 从而防止硬件故障导致的数据丢失
  • 将集群中任一节点的请求路由到存有相关数据的节点
  • 集群扩容时无缝整合新节点 , 重新分配分片以便从离群节点恢复
水平扩展VS垂直扩展ES对水平扩展是友好的 , 通过购置更多的机器 , 可以更好的使用ES的分布式功能
集群集群拥有一个或多个节点 , 当有节点加入或者退出集群时 , 集群会重新平均分配所有数据的分布