• es数据操作入门


    一、es数据存储简单介绍
    1. 概念解释
    Index:索引,它是单个数据库的同义词。
    Type:索引类型,它是单个数据表的同义词。
    Document:文档,它是单条数据记录的同义词。
    mapping:映射,相当于数据库的表结构。
      理论上一个Index可以包含多个Type,但是在实际应用中一般一个Index只包含一个Type,若包含多个Type,容易造成数据干扰等问题,有百害而无一利。
      一般情况下我们是先往es中插入数据,es会自动识别各个字段类型,创建索引,然后我们再查询mapping,将mapping改成我们想要的索引结构,删除原有索引结构,手动创建索引结构。
    2. es索引基本原理
      es默认会为文档的所有字段建立倒排索引。
      es对单个字段的值的内容进行分词,分词汇总称为Term Dictionary,Term Dictionary中各个分词都对应一个文档ID数组(Posting List),Term Dictionary是有序的,查询时可使用二分查找,查找到Term即可根据对应的文档ID数组读取文档内容了。
      Posting List也是有序的,使用增量编码压缩,将大数变小数按字节存储。这样的存储方式不仅能节省存储空间,也方便多字段联合查询时多个Posting List之间进行并集操作,将各个字段查询到的Term对应的Posting List做按位与运算,即可得到最终的文档ID数组。
      当数据量很大时,Term Dictionary也是很庞大的,无法全部存在内存中,所以es又加多了一层Term Index,只存储部分词的前缀,以FST的形式保存在内存中(FST以字节的方式存储了所有的Term),节省内存,检索很快。
      所以es搜索数据时,先在内存中Term Index查询到对应的Term Dictionary的block位置,再去磁盘上查找Term,找到Term以后再根据对应的文档ID数组去读取文档数据。

    二. es简单操作入门
    注:以下操作皆是在kibana上进行的,Index为“school”,Type为“student”。
    1. 插入文档

    PUT /school/student/1
    {
      "name": "JetWu",
      "age": 18,
      "city": "Jieyang",
      "interests": ["basketball", "badminton", "mountain climbing"],
      "introduction": "I am from Jieyang. I love my hometown"
    }
    PUT /school/student/2
    {
      "name": "是啊俊",
      "age": 18,
      "city": "揭阳",
      "interests": ["篮球", "羽毛球", "爬山"],
      "introduction": "我来自揭阳,我爱我的家乡"
    }
    PUT /school/student/3
    {
      "name": "疯一样的狼人",
      "age": 25,
      "city": "深圳",
      "interests": ["basketball", "羽毛球", "骑行"],
      "introduction": "大家好,我是疯一样的狼人,我现在在深圳,大家有空可以来找我玩。"
    }
    

    2. 更新文档

    PUT /school/student/1
    {
      "name": "JetWu",
      "age": 28,
      "city": "Jieyang",
      "interests": ["basketball", "badminton", "mountain climbing"],
      "introduction": "I am from Jieyang. I love my hometown"
    }
    

    3. 删除
    (1)删除某个文档:

    DELETE /school/student/1
    

    (2)删除整个索引:

    DELETE /school
    

    4. 搜索
    (1)按文档ID搜索:

    GET /school/student/1
    

    (2)搜索所有文档:

    GET /school/student/_search

    (3)全文搜索:

    GEt /school/student/_search
    {
      "query": {
        "match": {
          "interests": "羽毛球"
        }
      },
      "size": 2,//指定返回文档数量
      "from": 0//指定位移
    }

    查询结果:

    其中“_score”是评分,表示匹配度,从高到低排序。

    (4)精确匹配:

    GEt /school/student/_search
    {
      "query":{
        "term":{
          "age": 18
        }
      }
    }
    
    GEt /school/student/_search
    {
      "query": {
        "terms": {
          "age": [18, 28]
        }
      }
    }

    (5)范围搜索:

    GEt /school/student/_search
    {
      "query":{
        "range":{
          "age": {"gt": 20}
        }
      }
    }

    (6)取消评分排序,提高性能:

    GEt /school/student/_search
    {
      "query":{
        "constant_score": {
          "filter":{
            "range": {
              "age": {"gt": 20}
            }
          }
        }
      }
    }

    (7)or条件查询:

    GEt /school/student/_search
    {
      "query": {
        "match": {
          "interests": "骑行 篮球"
        }
      }
    }

    搜索多个关键字的时候,es默认它们是or的关系,若想表示and关系,需借助bool和must查询。

    (8)更复杂的搜索:

    GET /school/student/_search
    {
      "query": {
        "bool": {
          "must": [
            {"match": {
              "interests": "羽毛球"
            }},
            {"match": {
              "city" : "深圳"
            }}
          ],
          "filter": {
            "range": {
              "age": {
                "gte": 20,
                "lte": 30
              }
            }
          }
        }
      }
    }

    bool表示搜索条件组合,可以嵌套,其语法格式如下:

    {
        "bool":{
            "must":[],//与
            "should":[],//或  满足多个,评分更高,排列靠前
            "must_not":[]//否
        }
    }

    “must”、“should”、“must_not”都可以包含多个查询条件,分别是与、或、否的关系,而这三个整体则是与的关系。

    “filter”子句允许使用查询来限制将由其他子句匹配的文档,而不改变计算分数的方式。

    5. 操作映射

    (1)查看映射:

    GEt /school/student/_mapping
    

    插入数据时,若对应索引不存在,es会自动识别各个字段的数据类型,创建索引。

    (2)设置映射:

    如果es自动生成的映射不符合我们的需求,我们可以对它进行修改,删除并重新创建索引。例如:

    PUT /school
    {
      "settings": {
        "number_of_shards": 1,//分片数
        "number_of_replicas": 0//复制节点数
      },
      "mappings": {
        "student" : {
          "properties" : {
            "age" : {
              "type" : "long"
            },
            "name" : {
              "type" : "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            },
            "city" : {
              "type" : "text",
              "analyzer": "ik_max_word",//使用中文分词
              "search_analyzer": "ik_max_word"
            },
            "interests" : {
              "type" : "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            },
            "introduction" : {
              "type" : "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word"
            }
          }
        }
      }
    }

    es默认的索引的分片数和复制节点数设置分别是5和1,与实际情况不符时,索引状态是“yellow”。

    修改mapping设置,与实际情况相符以后,索引状态变成“green”。

  • 相关阅读:
    [Oracle维护工程师手记]一次升级后运行变慢的分析
    [Oracle运维工程师手记] 如何从trace 文件,判断是否执行了并行
    Top Page
    Python 输出文件内容到网络端口
    [Spark][Streaming]Spark读取网络输入的例子
    [Spark]如何设置使得spark程序不输出 INFO级别的内容
    linux 利器
    C++ 资源大全
    Who is using Asio?
    服务器开发知识要点
  • 原文地址:https://www.cnblogs.com/wujuntian/p/13087031.html
Copyright © 2020-2023  润新知