Elasticsearch(二) 入门使用-索引与映射

Elasticsearch: 6.4.2

1. 索引

索引是Elasticsearch中存储数据的一种逻辑结构。与关系型数据库对比:索引index类似于表,文档document类似于表中的行,字段field类似于表中的列,映射mapping类似于schema。索引是有分片组成的,可以分散到集群的多个节点中;分片实际上是Lucene的索引。

在Elasticsearch6.x中一个索引只能包含一种类型的文档。

1.1 索引操作

创建Index

PUT /twitter

获取Index

GET /twitter

删除Index

DELETE /twitter

Index是否存在

HEAD /twitter

打开/关闭Index

POST /twitter/_close
POST /twitter/_open
1.2 索引别名

索引别名是一个或多个缩影的另外一个名字。每个别名可以对应多个索引,每个索引也可以有多个别名。例如:我们将每天的日志创建一个索引,所有这些日志可以有有一个统一的索引名log;另外我们还可以将每年的日志的索引名再统一到一起起个别名log2018

不能使用已存在的索引名字作为别名。

创建别名

POST /_aliases
{
    "actions" : [
        { "add" : { "index" : "test1", "alias" : "alias1" } }
    ]
}

将索引从一个别名中删除

POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "test1", "alias" : "alias1" } }
    ]
}

获取所有别名

GET /_aliases

过滤别名

Elasticsearch支持以类似SQL数据中使用视图的方式使用别名。用户可以使用完整的查询DSL,并将查询应用在基于查询的统计、搜索、删除等操作上。

确保在映射中已存在该字段。

# 创建能够为客户12345返回数据的别名,则当使用该别名时,所有操作返回文档的clientId字段的值都是12345
POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "data",
                 "alias" : "client",
                 "filter" : { "term" : { "clientId" : "12345" } }
            }
        }
    ]
}

别名和路由选择

对于命名为client的索引别名,使用12345、12346、12347作为路由值用于索引,并仅将12345用于查询

POST /_aliases
{
    "actions" : [
        {
            "add" : {
                 "index" : "data",
                 "alias" : "client",
                 "index_routing" : "12345,12346,12347",
                 "search_routing": "12345"
            }
        }
    ]
}

当使用client别名对数据进行索引时,index_routing属性指定的值将被使用;当进行查询时,search_routing属性指定的值被使用

# search_routing和查询中routing参数的共同值12345作为路由值
GET /client/_search?q=test&routing=99999,12345
2. 映射
2.1 映射操作

映射Mapping用于定义索引Index的结构。

6.0版本之后_all可能不再支持,因此最好使用copy_to

copy_to: 允许创建定制的_all字段,将多个字段的值拷贝到查询时被当作单一字段使用的一组字段中。

_source: 包含文本被索引阶段的原始JSON文档内容,它不能被索引,因此也不能被搜索,只在fetch请求时返回数据。

创建或更新Mapping

PUT /twitter/_mapping/_doc 
{
  "properties": {
    "email": {
      "type": "keyword"
    }
  }
}

获取Mapping

GET /twitter/_mapping/_doc
# 类型为_doc的所有索引的映射
GET /_mapping/_doc
GET /_all/_mapping/_doc
# 所有索引所有类型的映射
GET /_all/_mapping
GET /_mapping

获取某字段的Mapping

GET /twitter/_mapping/_doc/field/email
2.2 分析器

通常情况下索引和搜索时应该使用相同的分析器,针对使用分析器搜索特定字段,查找顺序如下:

  • 当前查询语句中指定的分析器
  • 映射中search_analyzer参数定义的分析器
  • 映射中analyzer参数定义的分析器
  • 在索引settings部分default_search参数定义的分析器
  • 在索引settings部分default参数定义的分析器
  • 标准分析器

自定义分析器时需要在映射中添加一个settings部分,它保存创建索引时所需的信息。需要:

  • 零个或多个字符过滤器
  • 一个分词器
  • 零个或多个词过滤器
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type":      "custom", 
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  }
}

2.3 动态映射和模版

Elasticsearch最重要的特性之一就是动态映射,你不要先创建索引、定义映射,可以直接索引一个文档,此时elasticsearch自动帮你做这些工作。

每一个模版定义了一个模式,用来与新建索引的名称进行比较;如果匹配则模版中定义的值被复制到索引结构的定义中。如果有多个模版匹配上了新建索引名称,所有模版都会被应用,并且后应用的模版会覆盖先应用的模版。其中的order参数可以控制模版的预期使用顺序。

PUT my_index
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [
        {
          "longs_as_strings": {
            "match_mapping_type": "string",
            "match":   "long_*",
            "unmatch": "*_text",
            "mapping": {
              "type": "long"
            }
          }
        }
      ]
    }
  }
}
2.4 路由

怎么索引和搜索

默认情况下,elasticsearch计算文档ID的hash值及hash值%主分片数的值,基于后者的值将文档放到某个可用的主分片中,然后复制到副分片。

搜索时将请求分发到索引的所有分片中,然后在每一个分片中根据条件查找文档并传递给某一个节点,该节点进行全局的过滤和排序等,并将最终结果返回给客户端。

路由选择可以控制文档和查询被转发到某一个特定的分片上。既可以在索引和搜索请求时使用routing参数,也可以在类型定义时使用_routing参数。

PUT /twitter/_doc/1?routing=kimchy
{
    "user" : "kimchy",
    "postDate" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

PUT my_index2
{
  "mappings": {
    "_doc": {
      "_routing": {
        "required": true,
        "path": "id"
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值