`
kfcman
  • 浏览: 400026 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Mappings in Elasticsearch

 
阅读更多

虽然都是基于Lucene,Elasticsearch默认运行使用时,是不需要像Solr一样配置索引字段文件的,从开发者角度来看数据结构很灵 活,只需要向数据库提交任意格式的JSON就行了,实际上,Elasticsearh对Lucene的索引文档映射进行了封装,每次提交时都是在原有数据 结构上检查并增加,而且,并不是所有的数据结构改变都能对后续数据生效。这样一来,需要对数据结构进行更多灵活控制时,Elaticsearch远远比 Solr复杂。这篇文章将给大家介绍在Elasticsearch中Mappings的主要类型和工作原理,以及如何使用Shell和API进行操作。

 

Elasticsearch的Mappings分为两种类型,索引文件(index)的根级别Mapping、文档类型(type)级别的Mapping,类型Mapping下又分为预置默认的Fields和自定义源(source)的Fields.

 

Index Mapping

 

根级别的Mapping会被此索引文件下所有的文档继承,在操作中,使用 “_default_” 来识别。在创建Index时,可以同时创建默认的Mapping,注意的是,这个级别的Mapping只能在创建索引时指定才会生效。

 

curl -XPOST localhost:9200/myindex -d '{
    "mappings" : {
        "_default_" : {
            "_source" : { "enabled" : false }
        }
    }
}'

 

使用JavaScript API创建默认Mapping

 

client.indices.create({
    index:"myindex"}).then(function(body){var mapping ={"_default_":{"_source":{"enabled":"false"}}};
    client.indices.putMapping({
        index:"myindex",
        body: mapping
    }).then(function(body){
        console.log("created");});});

 

查询定义的Mapping

 

http://localhost:9200/_mapping?pretty

 

可以看到输出

 

"myindex":{"mappings":{"_default_":{"_source":{"enabled":false}}}}

 

Type Mapping : Default Fields

 

默认的映射字段的命名都是以下划线开始,具体可以参考Elasticsearch Fields文档。需要特别提到的是_timestamp字段,它可以为每个索引文档自动创建时间戳,但默认这个字段并未启用,在MongoDB中,ID其实就是TimeStamp,看来Elasticsearch不是很重视时间序列。

 

如果需要启用_timestamp,必须在创建索引时指定Mapping,否则,即使以后更改,新的数据也是无法加上时间戳的。下面为索引中所有文档类型启用时间戳:

 

curl -XPOST localhost:9200/myindex -d '{
    "mappings" : {
        "_default_" : {
            "_timestamp" : { "enabled" : true, "store" : true }
        }
    }
}'

 

其中的 “store” : true,如果对Lucene或Solr比较熟悉应该不陌生,启用store后索引文件中会保存原始值,如果只作查询范围不需要显示的话,可以让它保持默 认值false. 如果只需要为某个文档类型启用_timestamp,将上面的 “_default_” 改为文档类型名称即可,但依然需要在创建第一个文档之前指定。

 

client.indices.create({
    index:"myindex"}).then(function(body){var mapping ={"mydoc":{"_timestamp":{"enabled":"true","store":"true"}}};
    client.indices.putMapping({
        index:"myindex",
        type:"mydoc",
        body: mapping
    }).then(function(body){
        console.log("created");});});

 

查询指定文档的Mapping

 

http://localhost:9200/myindex/mydoc/_mapping?pretty

 

"myindex":{"mappings":{"mydoc":{"_timestamp":{"enabled":true,"store":true},"properties":{}}}}

 

对于默认的字段,也需要在索引时指定其值,否则无法创建索引文档。

 

client.index({
    index:'myindex',
    type:'mydoc',
    timestamp:newDate(),
    body: req.body
}).then(function(body){
    res.send(200,"ok");},function(error){});

 

查询_timestamp时需要在fileds中指定

 

http://localhost:9200/myindex/mydoc/1?pretty=1&fields=_source,_timestamp

 

默认类型是long

 

{"_index":"myindex","_type":"mydoc","_id":1,"_version":1,"found":true,"_source":{},"fields":{"_timestamp":1412329642820}}

 

Type Mapping : Custom Fields

 

自定义字段其实是全部放置在默认字段_source中的,在Mappings对应的是Properties节点。这类字段可以在任何时间进行更新,Elasticsearch可以处理类型冲突和合并。

 

$ curl -XPUT 'http://localhost:9200/myindex/mydoc/_mapping'-d '
{
    "mydoc" : {
        "properties" : {
            "message" : {"type" : "string", "store" : true }
        }
    }
}

从这里我们可以看到,在数据结构上,即使是最灵活的Elasticsearch,也是需要预先对索引和文档类型级别的字段进行设计和定义,合并字段时是否需要重新索引,我并没有测试过,这点似乎还不及MongoDB的文档结构灵活

分享到:
评论

相关推荐

    ElasticSearch安装ik分词插件.txt

    cp elasticsearch-analysis-ik-1.2.5.jar ES_HOME/plugins/analysis-ik/ ``` 同时,在 ElasticSearch 的配置文件 `elasticsearch.yml` 中添加以下内容来启用 ik 分词器: ```yaml index: analysis: analyzer: ik...

    Elasticsearch.Essentials.1784391018.pdf

    Get the latest guide on ElasticSearch 2.0.0, which contains concise and adequate information on handling all the issues a developer needs to know while handling data in bulk with search relevancy ...

    Elasticsearch.A.Complete.Guide.epub

    Through this comprehensive course, you'll learn the basics of Elasticsearch and progress to using Elasticsearch in the Elastic stack and in production. Table of Contents Chapter 1. Module 1 Chapter ...

    elasticsearch parent-child

    **Elasticsearch Parent-Child 关系理解与应用** 在Elasticsearch中,Parent-Child关系是一种特殊的数据模型,用于处理一对多的关系,如一篇文章(Parent)有多个评论(Child)。这种关系模型允许我们对子文档进行...

    Python 操作 ElasticSearch的完整代码

    Python操作ElasticSearch是通过官方提供的`elasticsearch`库实现的,这个库为Python开发者提供了一个方便的接口来与ElasticSearch服务器进行交互。在开始之前,你需要确保已经正确安装了`elasticsearch`库,可以通过...

    ES HTTP操作

    Elasticsearch(简称ES)是一款基于Lucene的搜索服务器。它提供了一个分布式多租户能力的全文搜索引擎,使用RESTful Web接口。本文将详细介绍ES中常见的HTTP API操作,这些操作可以帮助开发者更好地理解和使用ES的...

    Python库 | elasticmagic-0.1.0a0-py3-none-any.whl

    es = Elasticsearch([{'host': 'localhost', 'port': 9200}]) ``` 2. 创建索引和定义映射: ```python es.indices.create(index='my_index') mapping = { 'mappings': { 'properties': { 'title': {'type': '...

    Python库 | elastiknn_client-0.1.0rc8.dev225-py3-none-any.whl

    6. **兼容性**:`elastiknn_client`与Elasticsearch版本兼容,确保在不同的Elasticsearch环境中都能正常工作。 **安装与使用** 这个压缩包文件"elastiknn_client-0.1.0rc8.dev225-py3-none-any.whl"是一个预编译的...

    elasticsearch-docvalues-string:索引为文档值的可排序弹性搜索字符串

    echo "Create a superhero type in the test index that name property" echo " is indexed as lowercased and persisted as a docvalue" curl -XPOST localhost:9200/test -d '{ "settings" : { "number_of_...

    SAP PI Handbook 71

    - **Overview of Mapping Objects in the ES Repository**: Understanding the objects used for mapping, such as mapping functions and variables. - **Operation Mapping**: Mapping operations that define how...

    SAP PO/PI教程 Process Orchestration The Comprehensive Guide

    6.3.2 Importing SLD Objects into the ES Repository in SAP NetWeaver Developer Studio 6.3.3 Create Enterprise Service Repository Objects 6.3.4 Create Directory Objects: Import Business Systems and ...

    sigmod2011全部论文(1)

    Zephyr: Live Migration in Shared Nothing Databases for Elastic Cloud Platforms (Page 301) Aaron J. Elmore (University of California, Santa Barbara) Sudipto Das (University of California, Santa Barbara...

Global site tag (gtag.js) - Google Analytics