美文网首页
Elasticsearch 调研

Elasticsearch 调研

作者: 王龙江_3c83 | 来源:发表于2019-03-19 20:19 被阅读0次

    1. 基础概念

    1.1 倒排索引原理

    倒排索引原理举例.png 倒排索引原理.png

    1.2 倒排索引构成

    • 单词词典,使用 BTree 记录所有文档的单词,记录单词到倒排列表之间的关联信息。
    • 倒排索引项(Posting)。
      |术语|概念|
      |------|------|
      |文档 Id|用于获取原始信息|
      |单词频率|记录该单词在该文档中出现的次数,用户后续相关性分析|
      |位置|记录单词在文档中的分词位置,用于做词语检索。|
      |偏移(Offset)|记录单词在文档的开始和结束为止,用于高亮显示。|
      对每个属性建立倒排索引。
    • 分词
      分词是指将文本转换为一系列单词(term or token)的过程,也可以叫文本分析,在 es 中称为 Analysis。
    • 分词器
      分词器是 es 中专门处理分词的组件,英文名为 Analyzer,它的组成如下:
      Character Filters:针对原始文本进行处理,比如去除 html 特殊标识符等。
      Tokenizer:将原始文本按照一定规则切分成单词。
      Token Filters:针对 Tokenizer 处理的单词进行再加工,比如转小写,删除新增等处理。


      屏幕快照 2019-01-10 上午9.38.10.png
    屏幕快照 2019-01-10 上午9.40.38.png
    屏幕快照 2019-01-10 上午9.41.56.png

    1.2 关键词解释

    名称 定义
    索引 含有相同属性的文档集合,类似于数据库。
    类型 索引可以定义一个或多个类型,文档必须属于一个类型,类似于表。
    文档 可以被索引的基本数据单位,类似于记录。
    分片 每个索引有多个分片,每个分片是一个 Lucene 索引。
    副本 拷贝一个分片就形成该分片的一个副本。
    Mapping 类似于数据库中的表结构定义,主要作用如下:(1)定义 Index 下的字段名(Field Name);(2)定义 字段的类型,比如数值型、字符串型、布尔型等;(3)定义倒排索引相关的配置,比如是否索引、记录 position 等。

    2. Rest API

    以下 API 基于 ES7。

    2.1 Mapping 设置

    创建索引:分片数为3,副本数位1的索引,该索引中包含一个 man 类型和一个 woman 类型,其中 man 类型包括 "name"、"country"、"age"和"date"属性。

    PUT /people 
    {
      "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
      },
      "mappings":{   
        "properties":{
          "name":{
            "type":"text"
          },
          "country":{
            "type":"keyword"
          },
          "age":{
            "type":"integer"
          },
          "birthday":{
            "type":"date",
            "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          }
        }
      }
    }
    

    2.2 增加文档

    指定文档 id

    PUT /people/_doc/1
    {
      "name":"wlj",
      "country":"china",
      "age":"24",
      "birthday":"1994-06-01"
    }
    

    不指定文档 id

    POST /people/_doc
    {
      "name":"wlj1",
      "country":"china",
      "age":"24",
      "birthday":"1994-06-01"
    }
    

    2.3 修改文档

    将 id 为 1 的文档 name 属性改为 "wlj1"

    POST /people/_doc/1/_update
    {
      "doc":{
        "name":"wlj1"
      }
    }
    

    2.4 Search API

    2.4.1 全量查询

    GET /people/_search 
    

    全量查询,返回第一条。

    POST /people/_search 
    {
      "query":{
        "match_all":{}
      },
      "from":1,
      "size":1
    }
    
    URL 功能
    /_search 查询所有的索引。
    /my_index/_search 查询单个索引。
    /my_index1,my_index2/_search 查询多个索引。
    /my_*/_search 使用通配符查询多个索引。

    2.4.2 主键查询

    GET /people/_doc/1
    

    2.4.3 全文检索

    match_phrase 和 match 的区别:关键词出现顺序一致,使用 slop 设置差异度。

    POST /people/_doc/_search
    {
      "query":{
            "match":{
                    "name":"wlj1"
            }
      },
      "sort":[
        {"birthday":{"order":"desc"}}
      ]
    }
    

    2.4.6 复合查询

    should
    must
    must_not

    2.4.7 聚合查询

    按 "publish_date" 聚合计数

    POST /people/_doc/_search
    {
      "query":{
        "match":{
          "country":"china"
        }
      },
      "aggs":{
        "group_by_birthday":{
          "terms":{
            "field":"birthday"
          }
        }
      },
      "sort":[
        {"birthday":{"order":"desc"}}
      ]
    }
    

    查询 "publish_date" 的统计值

    {
      "aggs":{
            "grades_publish_date":{
                    "stats":{
                            "field":"publish_date"
                    }
            }
      }
    }
    

    查询 "publish_date" 的最小值

    {
      "aggs":{
            "grades_publish_date":{
                    "min":{
                            "field":"publish_date"
                    }
            }
      }
    }
    

    2.4.9 关键字

    关键字 功能
    "profile":true 显示查询过程。
    explain 显示相关性算分过程。

    参考资料

    相关文章

      网友评论

          本文标题:Elasticsearch 调研

          本文链接:https://www.haomeiwen.com/subject/qhxnmqtx.html