zoukankan      html  css  js  c++  java
  • 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格式)
  • 相关阅读:
    【做题记录】区间排序—线段树
    【做题记录】CF1428E Carrots for Rabbits—堆的妙用
    线段树合并、分裂
    一、drf入门规范
    七、Django实战--图书管理系统搭建
    六、ORM模型层补充
    五、Django之模型层
    四、Django之模板层
    三、Django之视图层
    二、Django之路由层
  • 原文地址:https://www.cnblogs.com/xyj179/p/9329481.html
Copyright © 2011-2022 走看看