默认mapping

elasticsearch(以下简称ES)是没有模式(schema)的,当我们执行以下命令:

curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"zach", "description": "A Pretty cool guy."}'  

ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping。

mappings: {
item: {
properties: {
description: {
type: string
}
name: {
type: string
}
}
}
}

什么是mapping

ES的mapping非常类似于静态语言中的数据类型:声明一个变量为int类型的变量, 以后这个变量都只能存储int类型的数据。同样的, 一个number类型的mapping字段只能存储number类型的数据。

同语言的数据类型相比,mapping还有一些其他的含义,mapping不仅告诉ES一个field中是什么类型的值, 它还告诉ES如何索引数据以及数据是否能被搜索到。

当你的查询没有返回相应的数据, 你的mapping很有可能有问题。当你拿不准的时候, 直接检查你的mapping。

剖析mapping

一个mapping由一个或多个analyzer组成, 一个analyzer又由一个或多个filter组成的。当ES索引文档的时候,它把字段中的内容传递给相应的analyzer,analyzer再传递给各自的filters。

filter的功能很容易理解:一个filter就是一个转换数据的方法, 输入一个字符串,这个方法返回另一个字符串,比如一个将字符串转为小写的方法就是一个filter很好的例子。

一个analyzer由一组顺序排列的filter组成,执行分析的过程就是按顺序一个filter一个filter依次调用, ES存储和索引最后得到的结果。

总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

默认analyzer

回到我们的例子, ES猜测description字段是string类型,于是默认创建一个string类型的mapping,它使用默认的全局analyzer, 默认的analyzer是标准analyzer, 这个标准analyzer有三个filter:token filter, lowercase filter和stop token filter。

我们可以在做查询的时候键入_analyze关键字查看分析的过程。使用以下指令查看description字段的转换过程:

curl -X GET "http://localhost:9200/test/_analyze?analyzer=standard&pretty=true" -d "A Pretty cool guy."

{
"tokens" : [ {
"token" : "pretty",
"start_offset" : 2,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 2
}, {
"token" : "cool",
"start_offset" : 9,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 3
}, {
"token" : "guy",
"start_offset" : 14,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 4
} ]

可以看到, 我们的description字段的值转换成了[pretty], [cool], [guy], 在转换过程中大写的A, 标点符号都被filter过滤掉了, Pretty也转成了全小写的pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这三个单词了, 其他的都是抛弃掉了。

看看以单词a来搜索的结果:

$ curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
"query" : {
"text" : { "description": "a" }
}
}' {
"took" : 29,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}

text类型的搜索在查询过程中使用了和之前插入数据相同的分析/过滤系统, 所以我们输入"a",mapping不会有任何返回, 因为单词“a”不会被ES存储和索引。反过来,如果我们使用单词"cool"进行搜索:

curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{
"query" : {
"text" : { "description": "cool" }
}
}' {
"took" : 29,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.15342641,
"hits" : [ {
"_index" : "test",
"_type" : "item",
"_id" : "1",
"_score" : 0.15342641, "_source" : {"name":"zach", "description": "A pretty cool guy"}
} ]
}
}

现在就能得到正确的结果,这是一个公认的简单例子, 但是它描述了ES是如何工作的, 不要把mapping想成是数据类型, 把它想象成是搜索数据的指令集合。如果你不想字符"a"被删除, 你需要修改你的analyzer。

原文: http://euphonious-intuition.com/2012/07/an-introduction-to-mapping-in-elasticsearch/

elasticsearch中的mapping简介的更多相关文章

  1. elasticsearch中的mapping映射配置与查询典型案例

    elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...

  2. ElasticSearch 中的 Mapping

    公号:码农充电站pro 主页:https://codeshellme.github.io 1,ES 中的 Mapping ES 中的 Mapping 相当于传统数据库中的表定义,它有以下作用: 定义索 ...

  3. elasticsearch中mapping全解实战

    目录 Mapping简介 Mapping Type 分词器最佳实践 字段类型 text 类型 keyword 类型 date类型 object类型 nest类型 range类型 实战:同时使用keyw ...

  4. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  5. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作

    http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...

  6. 使用Elasticsearch中的copy_to来提高搜索效率

    在今天的这个教程中,我们来着重讲解一下如何使用Elasticsearch中的copy来提高搜索的效率.比如在我们的搜索中,经常我们会遇到如下的文档: { "user" : &quo ...

  7. 如何在Elasticsearch中安装中文分词器(IK+pinyin)

    如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题--中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组. ...

  8. Elasticsearch中的相似度模型(原文:Similarity in Elasticsearch)

    原文链接:https://www.elastic.co/blog/found-similarity-in-elasticsearch 原文 By Konrad Beiske 翻译 By 高家宝 译者按 ...

  9. elasticsearch的映射(mapping)和分析(analysis)

    转发自:http://blog.csdn.net/hzrandd/article/details/47128895 分析和分析器 分析(analysis)是这样一个过程: 首先,表征化一个文本块为适用 ...

随机推荐

  1. Java中文件的常用操作

    一.文件的移动 File afile =new File("D:\\workspace\\Test\\test.avl");  if(afile.renameTo(new File ...

  2. JavaFX 之自定义窗口标题栏(二)

    一.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 二.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...

  3. ShowDialog窗体的return问题

    最近的一个项目里,打开新窗口用到了ShowDialog()这种方式,发现在新窗口做保存操作的时候,保存按钮事件下的程序执行完(无论有没有return)都会关闭子窗口. 网上查了一下,发现大家说的方法在 ...

  4. SecureCRT上传下载文件教程(Zmodem使用教程)

    SecureCRT是一个仿真终端连接工具.它可以方便的连接SSH服务器,远程管理Linux.同时,它还能使用多种协议方便的上传下载文件.其中Zmodem是SecureCRT支持比较好的一种古老的上传下 ...

  5. 关于vim搜索/替换功能的两条配置

    之前是直接照着这篇的配置的强大的vim配置文件 自己也只是对vim新建文件修改文件的哪个函数SetTitle()做了点修改,毕竟用vim只写C/C++和python.shell. 没想到今天在用vim ...

  6. 嵌入式设备snmpd 移植和测试(78K为例)

    一.源码目录项内容 agent:编译snmpd程序所需的文件,mibs源文件: apps:其他相关的程序:snmpwalk,snmptrap,snmptest,snmpget,snmpset: mib ...

  7. 转-SpringMVC——之 国际化

    原文地址:http://www.cnblogs.com/liukemng/p/3750117.html 在系列(7)中我们讲了数据的格式化显示,Spring在做格式化展示的时候已经做了国际化处理,那么 ...

  8. Java 五子棋小游戏

    package Day8_06; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import ...

  9. eclipse插件-easy explore

    最近找到一个Eclipse的插件,名字是Easy Explore,是Easy Structs 其 中的一个部分.主要的功能就是在Eclipse里面视图的部分如果看到自己的工程,或者Package,包什 ...

  10. STL算法与树结构模板

    STL算法 STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单如for_each(遍历)到复杂如stable_sort(稳定排序),头文件是:#include <algorithm ...