zoukankan      html  css  js  c++  java
  • es笔记---新建es索引

    es对索引的一堆操作都是用restful api去进行的,参数时一堆json,一年前边查边写搞过一次,这回搞迁移,发现es都到6.0版本了,也变化了很多,写个小笔记记录一下。

    创建一个es索引很简单,一个put请求。

    PUT /my_index
    {
        "settings": { ... any settings ... },
        "mappings": {
            "type_one": { ... any mappings ... },
        },
      "aliases" : {...}
    }
    

    新建一个索引,包含settings mappings 和aliases。settings设置分片等一些参数,mappings设置如何处理索引的各个type,aliases以前没有用过,看上去我不太会用到,这边就不记录了。

    settings

    这边有非常多的参数可以设置,不过官方是不建议修改的。常见需要改的就俩

    • number_of_shards
      每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
    • number_of_replicas
      每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。
    PUT /my_temp_index
    {
        "settings": {
            "number_of_shards" :   3,
            "number_of_replicas" : 2
        }
    }
    

    给索引设置settings值

    PUT /my_temp_index/_settings
    {
        "number_of_replicas": 1
    }
    

    修改settings值

    mappings

    每个文档都有type,每种type都会有自己的mapping。mapping定义了type的field,每个field的数据类型,以及es如何处理这些field。

    注意,一个mappings里边不建议有多个type,而且在es6之后的版本很有可能会不允许有多个type。

    按照官方的计划,es7-es9会逐步去掉type

    建议是每个index都只有一个type,原因是一个index中的各个type的字段并不是完全独立的,一个index中多个type会造成一些浪费。

    可以通过/_mapping 来查看es中一个或多个索引中的一个或多个mapping。

    数据类型 (field)

    • 字符串 string
      • text
      • keyword
    • 数字
      • long integer short byte double float half_float scaled_float
    • 布尔型 boolean
    • 日期 date
    • range
      • integer_range
      • float_range
      • long_range
      • double_range
      • date_range
    • array
    • object

    还有很多我确定我不会用到的类型。

    当索引一个包含新的field的文档时,es会使用<b>动态映射</b>,通过JSON中基本数据类型,尝试猜测field类型

    一般情况下,默认映射就足够了。es会自动把如 123 映射为integer,123.123映射为double,但是很多情况下,我们都需要自定义映射,特别是string类型。

    自定义映射可以做这些事:

    • 配置为全文字符串和精确字符串 (如name字段我更希望他不要分词,而desc字段更需要分词后搜索)
    • 使用特定语言分析器
    • 。。。

    一个field最主要的属性是type,对于大部分field,一般只需要设置type就可以了:

    {
        "number_of_clicks": {
            "type": "integer"
        }
    }
    

    range

    PUT range_index
    {
      "mappings": {
        "my_type": {
          "properties": {
            "expected_attendees": {
              "type": "integer_range"
            },
            "time_frame": {
              "type": "date_range", 
              "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
            }
          }
        }
      }
    }
    

    插入格式

    PUT range_index/my_type/1
    {
      "expected_attendees" : { 
        "gte" : 10,
        "lte" : 20
      },
      "time_frame" : { 
        "gte" : "2015-10-31 12:00:00", 
        "lte" : "2015-11-01"
      }
    }
    

    搜索格式

    POST range_index/_search
    {
      "query" : {
        "range" : {
          "time_frame" : { 
            "gte" : "2015-10-31",
            "lte" : "2015-11-01",
            "relation" : "within" 
          }
        }
      }
    }
    

    这部分比较简单 不细致展开了

    string

    对于string类型,以前是只有string,现在分为了两种,keyword和text

    text

    text会先经过分析器,然后索引起来,类似desc这样的字段就需要使用text。有以下几个重要字段。

    analyzer

    分析器,可以指定如何处理这个string,比如我想先把所有html的标记全去掉,再分词,再删除无用的停顿次,然后把剩下的token索引起来。可以使用默认的standard分析器,也可以指定别的内置的分析器。也可以使用插件安装的第三份分析器,如ik,也可以自定义分析器。

    分析器使用起来很简单

    {
        "desc": {
            "type":     "string",
            "analyzer": "ik_smart"
        }
    }
    

    其中,ik_smart是已经安装好的第三方分析器。

    index

    是否设置为可以搜索,boolean

    norm

    我理解是算分时是否进行一些标准化处理,需要额外的资源。

    fields

    这个字段很有趣.. 先看个例子

    "filename":{  
      "type":"text",
      "norms":false,
      "fields":{  
         "raw":{  
            "type":"keyword",
            "ignore_above":256
         }
      }
    },
    

    一个filename的字段,这边设置的是type是text,会分词搜索。但有时候我们需要精准匹配,就可以使用filename.raw。插入时只需要输入filename,保存在es里边的会有两份,filename和filename.raw。

    keyword

    和text不同,keyword不会经过分析器,搜索时会精确匹配。

    index fields

    这两个参数和text的相同

    ignore_above

    丢掉超过一定长度的字符串


    映射操作
    新建映射
    PUT /index_name
    {
      "mappings": {
        "person" : {
          "properties" : {
            "desc" : {
              "type" :    "string",
              "analyzer": "ik_smart"
            },
            "birth" : {
              "type" :   "date"
            },
            "name" : {
              "type" :   "string",
              "index" : "not_analyzed"
            },
            "user_id" : {
              "type" :   "long"
            }
          }
        }
      }
    }
    

    新建一个index,desc字段用ik分词索引,birth设置为日志,name字段精确索引,user_id设置为long型。

    更新映射
    PUT /index_name/_mapping/person
    {
      "properties" : {
        "tag" : {
          "type" :    "string",
          "index":    "not_analyzed"
        }
      }
    }
    

    新增一个tag字段。



    作者:辰辰沉沉沉
    链接:https://www.jianshu.com/p/bd23b86848dd
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    oracle grant授权的理解
    SQL SERVER 2005 版本以上 CTE递归查询的实现
    常用的加密解密技术之——【加密原理】
    常用的汇编指令
    常用加密解密技术之——【DES算法实现过程分析】
    VC6.0编译器中混有.c文件时出现fatal error C1853错误解决办法
    C++ Primer读书笔记
    Shot(数学+物理题,不简单)
    [置顶] C++/C 数据类型的取值范围
    <fzu1922>非主流
  • 原文地址:https://www.cnblogs.com/ExMan/p/11323651.html
Copyright © 2011-2022 走看看