默认mapping

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

curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"bob", "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。

es 中 mapping 简介相关推荐

  1. ES中mapping是什么,es中的数据类型

    mapping解释 ES中的mapping有点类似与RDB中"表结构"的概念,在MySQL中,表结构里包含了字段名称,字段的类型还有索引信息等.在Mapping里也包含了一些属性, ...

  2. ES中mapping讲解

    注意:以下都是基于ES6操作的 准备数据 PUT /web/info/1 {"post_date": "2018-11-01","title" ...

  3. SpringData ES中字段名和索引中的列名字不一致导致的无法查询数据的解决方法

    为什么80%的码农都做不了架构师?>>>    用SpringDataElasticsearch查询数据的时候可以将实体中的字段名与ES中mapping中field的名字起成一样的名 ...

  4. ES修改mapping中的字段名称

    前言 我们都知道,在ES中一旦声明了字段名称,就不能对字段名称进行修改了.只能新增字段,不能删除.修改已经声明的mapping字段. 那么,如果我们需要修改mapping中的字段名称,需要怎么操作呢? ...

  5. elasticsearch中mapping全解实战

    Mapping简介 mapping 是用来定义文档及其字段的存储方式.索引方式的手段,例如利用mapping 来定义以下内容: 哪些字段需要被定义为全文检索类型 哪些字段包含number.date类型 ...

  6. Elasticsearch和Hive整合,将hive数据同步到ES中

    1 Elasticsearch整合Hive 1.1 软件环境 Hadoop软件环境 Hive软件环境 ES软件环境 1.2 ES-Hadoop介绍 1.2.1 官网 https://www.elast ...

  7. ExtJs中Store简介(秘籍)

    ExtJs中Store简介(秘籍) 1.什么store? Store类似于一个本地仓库(即数据存储器),包括有 ArrayStore,DirectStore,GroupingStore,JsonSto ...

  8. 把json数据导入linux,使用json文件给es中导入数据

    使用json文件可以给es中导入数据,10万条左右的数据可以一次导入,数量太大时导入就会报错.大数量的到导入还是需要用bulk方式. accounts.json文件格式如下: {"index ...

  9. ES 中时间日期类型 “yyyy-MM-dd HHmmss” 的完全避坑指南

    文章目录 1.ES中的日期类型有何不同 2.案例 2.1 案例介绍 2.2 原理揭秘 3.路为何这么不平 4.又一个坑 5.总结 6.ES 的时间类型为什么这么难用,有没有什么办法可以解决? 7.更优 ...

  10. ES 中时间日期类型 “yyyy-MM-dd HH:mm:ss” 的完全避坑指南

    文章目录 1.ES中的日期类型有何不同 2.案例 2.1 案例介绍 2.2 原理揭秘 3.路为何这么不平 4.又一个坑 5.总结 6.ES 的时间类型为什么这么难用,有没有什么办法可以解决? 7.更优 ...

最新文章

  1. echarts柱状图x轴文字换行_深入 echarts 如何设置 Label / axisLabel 换行及自定义格式 / 自定义样式? 结合 canvas 如何实现文字换行来理解...
  2. 三菱modbusRTU通讯实例_干货 | 解析西门子系列PLC编程实例
  3. tomcat下只有.class文件 没有java文件_解决tomcat发布工程后,WEB-INF/classes下文件不编译的问题...
  4. iOS App 启动性能优化
  5. 第三次学JAVA再学不好就吃翔(part9)--基础语法之键盘录入
  6. 20159320《网络攻防实践》第5周教材总结
  7. C语言排序方法------快速排序
  8. 服务器栈虚拟交换机,FusionSphere分布式虚拟交换机技术白皮书1.docx
  9. 在2003上实现Custom Task Pane
  10. “基金公司+互联网平台” 带来了什么考验?
  11. 工业机器人行业应用-3C行业塔式机箱来料分拣、贴标及包装线体
  12. 书籍写作规范——Word 公式篇
  13. 人民币转换美金的c语言代码大全,美元换算(人民币换算)
  14. 全市场等权中位数_市场指数估值周报20200412
  15. 信息安全与密码学概论
  16. 计算机连接公用网络受限,电脑连接无线网络受限怎么解决【解决方法】
  17. jenkins checkstyle:local variable hides a field
  18. Oracle系列:start with connect by prior 使用方法
  19. 当代中国最贵的汉字是什么?
  20. 计算机网络涉及的数学知识点,计算机考研:计算机网络六大重要知识点

热门文章

  1. js树结构数据的递归操作
  2. 工业互联网的内涵及其应用
  3. 谷歌地图的API应用
  4. 无损音乐ape转wav图文教程
  5. 计算机打不开硬盘,电脑硬盘打不开的原因和解决办法
  6. python打开qq并登录_python爬虫入门之qq登陆初探
  7. 《深入理解Java虚拟机》笔记04之垃圾收集算法
  8. php分页类 seo,laravel 分页seo浅谈
  9. 电气版CAD学习笔记
  10. 爬取贝壳网深圳二手房实战