映射(mapping)

就像是在 Data
in, data out
中解释过的,index中的每个document都有type。每个type都有自己的mapping或者schema
definition。在type中mapping定义filed,定义每个filed中的数据类型,定义ES怎么处理这个filed,mapping也用于配置与该类型相关联的元数据。

我们会在 Types
and Mappings
中详细的讨论mapping,在这个章节,我们就是能让你足够开始就行了。

core simple field types


ES支持下面的简单的filed type:

















String:

string

Whole number:

byteshortintegerlong

Floating point:

floatdouble

Boolean:

boolean

Date:

date

当你index一个包含了新类型的document的时候——也就是上面表格中没有提到的——ES就会使用根据 dynamic
mapping
 从JSON中的数据类型
尝试猜测filed的type:




















JSON type:

Field type:

Boolean: true or false

"boolean"

Whole number: 123

"long"

Floating point: 123.45

"double"

String, valid date: "2014-09-15"

"date"

String: "foo bar"

"string"

也就是说,如果你index一个使用双引号包括起来的数字,它就会成为一个string,而不是long。然而如果这个field已经被mapping映射成了long,ES会尝试向long进行转换,如果不行则会报异常。

viewing the mapping


我们可以查看ES已经拥有的mapping,无论这个mapping是映射到一个type还是多个type,无论是一个index还是多个index。使用/_mapping作为请求的结束。在 start
of this chapter
中我们已经检索过gb中的tweet的mapping:

GET /gb/_mapping/tweet

返回值展示了ES根据index的document动态生成的field的mapping(就是properties属性):

{
   "gb":{
      "mappings":{
         "tweet":{
            "properties":{
               "date":{
                  "type":"date",
                  "format":"dateOptionalTime"
               },
               "name":{
                  "type":"string"
               },
               "tweet":{
                  "type":"string"
               },
               "user_id":{
                  "type":"long"
               }
            }
         }
      }
   }
}

不正确的mapping,比如把age映射为string而不是integer,就会对查询产生混淆的结果。

customizing field mappings


field的最重要的属性就是type,对于不是string类型的field,除了type,你几乎很少会mapping其他的属性。

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

string类型的field,默认的被当中full text的类型,就是说在存储之前他们的值要经过分词器进行分词,并且对full
text的检索也要经过相同的分词器进行分词。

对于string类型来说两个最重要的mapping属性就是index和analyzer。

index

这个属性控制着string是怎么存储的。其值是一下三个中的一个,

1:analyzed——首先对其进行分词,然后存储,就是把这个field作为full text。

2:not_analyzed——存储这个field,让其可搜索,但是要确切的存储,不要对其进行分词。

3:no——不要存储这个field。这个field也是不可搜索的。

默认值是analyzed。如果你想把他当作是确切的值,你需要如下设置:

{
    "tag":{
        "type":     "string",
        "index":    "not_analyzed"
    }
}

其他的简单的类型——long,double,date等——也接受index这个参数,但是值只有no和not_analyzed,因为他们的值是不可以analyzed的。

analyzer

对于string
field,使用analyzed属性是指定index和search的时候要应用的分词器,默认ES使用standard,但是你可以修改这个属性的值,比如:whitespace,simple,english:

{
    "tweet":{
        "type":     "string",
        "analyzer":"english"
    }
}

在 Custom
analyzers
 中我们会介绍怎么自定义一个analyzed。

Updating a mapping


当你在第一次创建index的时候你可以指定一个mapping。当然,你也可以使用/_mapping对一个新的type添加mapping(或者是一个已经存在的type的mapping)

一旦你添加一个mapping,就最好不要修改他,如果一个field已经被mapping,有可能这个filed已经存储的有数据了,如果这个时候修改这个filed的mapping,先前的被index的数据将会导致错误从而变得不可搜索。

你可以对新添加的field更新mapping,但是最好不要把已经存在的field从analyzed便更为not_analyzed。

为了演示所有指定mapping的方式,我们首先删除gb这个index:

DELETE /gb

然后创建一个新的index,指定tweet字段使用english分词器:

PUT /gb 
{
  "mappings":{
    "tweet":{
      "properties":{
        "tweet":{
          "type":    "string",
          "analyzer":"english"
        },
        "date":{
          "type":   "date"
        },
        "name":{
          "type":   "string"
        },
        "user_id":{
          "type":   "long"
        }
      }
    }
  }
}

标记1处表示使用指定mapping创建index。

接着,我们向tweet添加一个名为tag的field,并且向新的字段添加not_analyzed属性:

PUT /gb/_mapping/tweet
{
  "properties":{
    "tag":{
      "type":    "string",
      "index":    "not_analyzed"
    }
  }
}

现在,我们不需要列出已经存在的field,因为我们不能修改他们了,我们的新的field已经合并到已经存在的mapping中了。

Testing the mapping


你能通过field name使用analyze API测试mapping。比较一下两个请求的输出:

GET /gb/_analyze?field=tweet
Black-cats

GET /gb/_analyze?field=tag
Black-cats

这个tweet字段产生了两个term“black”和“cat",然而tagfield产生了单个的term”Black-cat“。换句话说就是,我们的mapping已经正常工作了。

原文:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html

时间: 2024-11-10 14:47:12

映射(mapping)的相关文章

KnockoutJS 3.X API 第八章 映射(mapping)插件

Knockout旨在允许您将任意JavaScript对象用作视图模型. 只要一些视图模型的属性是observables,您可以使用KO将它们绑定到您的UI,并且UI将在可观察属性更改时自动更新. 大多数应用程序需要从后端服务器获取数据. 由于服务器没有任何可观察的概念,它只提供一个纯JavaScript对象(通常序列化为JSON). 映射插件提供了一种简单的方法来将该简单的JavaScript对象映射到具有适当的observables的视图模型中. 这是替代手动编写自己的JavaScript代码

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

【IPC进程间通讯之三】内存映射文件Mapping File

IPC进程间通信+共享内存Mapping         IPC(Inter-Process Communication.进程间通信).         文件映射(Mapping)是一种将文件内容映射到内存地址的技术,通过对映射内存,读写文件如同读写内存一般简单.        多个进程映射同一个文件映射对象,也即多个进程映射到同一个物理存储页面,因此.当一个进程向映射内存写入数据时,其它进程能够通过映射内存读取数据.通过这个机制实现进程间通信.                  1.内存文件映

ES 12 - 配置使用Elasticsearch的动态映射(dynamic mapping)

目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2.2 策略示例 3 定制dynamic mapping策略 3.1 date_detection - 日期识别策略 3.2 在type中自定义动态映射模板 3.3 [过期]在index中自定义默认映射模板 1 动态映射(dynamic mapping) 1.1 什么是动态映射 动态映射时Elastic

ElasticSearch 基础(4) - Mapping

一.Mapping概述 为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成Full-text或者精确的字符串值. ES需要知道每个字段里面都包含了什么类型.这些类型和字段的信息存储(包含)在映射(mapping)中. 索引中每个文档都有一个类型(type).每个类型都拥有自己的映射(mapping)或者模式定义(schema definition). 一个映射定义了字段类型,每个字段的数据类型,以及字段被Elasticsearch处理的方式.映射还用于设置关联到类型上的元数据

Hibernate框架 主配置文件(Hibernate.cfg.xml) 映射配置 说明

Hibernate.cfg.xml 主配置文件中主要配置:数据库连接信息.其他参数.映射信息! 常用配置查看源码: hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties   <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hiber

elasticsearch的mapping和analysis

转发自:http://blog.csdn.net/hzrandd/article/details/47128895 分析和分析器 分析(analysis)是这样一个过程: 首先,表征化一个文本块为适用于倒排索引单独的词(term) 然后标准化这些词为标准形式,提高它们的"可搜索性"或"查全率" 这个工作是分析器(analyzer)完成的.一个分析器(analyzer)只是一个包装用于将三个功能放到一个包里: 字符过滤器 首先字符串经过字符过滤器(character

章节6 关联映射 (转载)

以简单的两个类为例: User(int id, String name) Group(int id, String name) 没有关联关系时的关系模型: t_user(id int pk, name varchar) t_group(id int pk, name varchar) 一.多对一和一对多关联映射(多个用户有相同的组) 这几种关联映射后的关系模型是相同的: t_user(id int pk, name varchar, gid int fk->t_group(id)) t_grou

Hibernate学习-6-集合映射保存案例

创建User类 package com.cxspace.collection; import java.util.*; /** * Created by cxspace on 16-7-24. */ public class User { private int userId; private String userName; //存储的对象无序 private Set<String> address; private List<String> addressList = new

解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. 1  LLBL Gen Pro 入门  LLBL Gen Pro Basic 打开LLBL Gen Pro程序,在右边的数据库浏览器(Catelog Explorer)中根结点右键选择从关系数据库创建关系模型( Add Relational Model Data from a Database),然