Elasticsearch

1.基础概念

1) 与mysql区别:

mysql
ES
差异
数据库 索引 逻辑上是一致的
type 逻辑上是一致的
doc 结构上存在差别
ES上的一个字段 mysql是连续存储的

 

2) 索引字段有为“索引(indexed)”和“存储(stored)”两个属性,只有被“索引”的字段才能在查询/排序条件中使用,只有被“存储”的字段才能在请求的时候返回字段内容,默认情况下字段是既“索引”又“存储”的。如果需要对索引进行“update”操作,那么所有字段都必须“存储(stored)”。

3) 索引创建之后是字段不可变的(Immutable),只允许新增字段。

2.索引数据结构

 搜索引擎使用倒排索引来组织数据,比如源文档{"id":1,"title":"这是一张很贵的名画","tag":12345}/{"id":2,"title":"这是一幅相当贵的名画","tag":54321},title可以分词为"这/是/一张/很/贵/名画/画"/"这/是/一幅/相当/贵/名画/画"("的"字作为停止词没有进入到索引),分词得到的每一个词元,比如"画",称作一个term,那么倒排索引存储的数据将会变成:

titletag
term文档idterm文档id
1,2 12345 1
1,2 54321 2
一张 1    
一幅 2    
1    
相当 2    
1,2    
名画 1,2    
1,2    

3.匹配问题

搜索引擎使用倒排索引来进行模糊匹配,以上文为例,输入"很贵的画"搜索时,首先输入词也进行分词"很/贵/画",然后用得到的term去和索引数据进行比对,得到:"很"->{1},“贵”->{1,2},"画"->{1,2},然后"很"∩"贵"∩"画"={1},得到文档1为结果,模糊匹配在索引内部都是通过分词后的term精确匹配来计算的。

匹配度:es的match查询通常可以带匹配度(默认是75%),以1.4为例,输入"很贵的画",如果匹配度是100%,那么结果就是"很"∩"贵"∩"画"={1},如果匹配度降到75%(搜索词越短,75%的范围越模糊),那么结果(按正常理解)可以是("很"∩"贵)υ("贵"∩"画")υ("很"∩"画")={1,2}。

4.查询入门

最常用的查询接口,search操作依据的是一个时刻t的快照数据,t之后变更的数据search结果是不会体现的,要高实时的获取单条记录,请使用get操作;

对单条数据的操作请使用kv操作方式(get/exists),开销比search小,实时性更高。

一、请求样例

请求url:http://[域名]/sync/search/[索引] 

            请求格式: post

完整示例:

curl -XPOST 'http://[域名]/sync/search/test_index' -d '{"query":{"match_all":{}}}'

返回:

{

  "result"true,   // 框架自动封装
  "code": 0,        // 框架自动封装
  "message": null,
  "data": {         // 这里开始才是搜索的响应
    "code": 0,          // 错误码
    "message""OK",    // 错误信息
    "took": 4,          // 耗时,ms
    "hits": {
      "hitCache"false// 是否通过缓存返回
      "totalHits": 100,  // 总结果数,不是当次返回的结果数
      "hits": [          // 结果集,数组形式
        {
          "id""0",     // 唯一键
          "score": 1.0,  // 匹配分
          "source""{\"kdt_id\":63077,\"id\":0,\"title\":\"测试商品2-update\"}"// doc内容,是一个json字符串
          "setxxx"true // 会有一坨和字段重名的setxxx属性,可以认为是基于nova暴露rest服务的缺陷(其实是为了描述字段是否被设置)
        }
      ]
    },
    "setxxx"true // 这里类似
  }
}
querykilller用户须知

一、默认以下查询会被kill:

  1. from > 3000
  2. size > 300
  3. terms内条件个数(相当于mysql的in)> 200
  4. sort中包含了排序禁止词: 
    1.  string类型字段
    2.  array字段
    3.  nested嵌套字段
  5. 统计查询agg size > 500
  6. scan查询timeout > 600000
  7. scan查询size > 500
  8. 查询qps > 100 

1.3 搜索条件(以mysql查询条件为对比):

    1. '='    :term
    2. '<','>' :range
    3. 'like'  : match (注意:不完全对等)
    4. 'in'    :terms
    5. 'and' : bool -> must
    6. 'not'  : bool -> must_not
    7. 'or'    : bool -> should

1.4 示例查询(用curl模拟):

      curl -XPOST "http://[host]:[port]/[biz_index]/[biz_type]/_search" -d 'biz_json_query'

  1. host:服务地址
  2. port:服务端口
  3. biz_index:服务的索引名(控制台有全部的)
  4. biz_type:服务的type名(一般是固定的,默认data,通过控制台可以拿到)
  5. biz_json_query:组装的查询语句(json格式)

 

posted on 2018-07-18 15:41  我&菜鸟  阅读(163)  评论(0编辑  收藏  举报