什么是映射

类似于数据库中的表结构定义,主要作用如下:

  • 定义Index下字段名(Field Name)
  • 定义字段的类型,比如数值型,字符串型、布尔型等
  • 定义倒排索引的相关配置,比如是否索引、记录postion等

需要注意的是,在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:

  • index.mapping.total_fields.limit:一个索引中能定义的字段的最大数量,默认是 1000
  • index.mapping.depth.limit:字段的最大深度,以内部对象的数量来计算,默认是20
  • index.mapping.nested_fields.limit:索引中嵌套字段的最大数量,默认是50

Mapping的数据类型

基本数据类型

属性名字 说明
text

用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引

keyword 不分词
long 有符号64-bit integer:-2^63 ~ 2^63 - 1
integer 有符号32-bit integer,-2^31 ~ 2^31 - 1
short 有符号16-bit integer,-32768 ~ 32767
byte  有符号8-bit integer,-128 ~ 127
double 64-bit IEEE 754 浮点数
float 32-bit IEEE 754 浮点数
half_float 16-bit IEEE 754 浮点数
boolean true,false
date https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html
binary

该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索

Mapping范围数据类型

标识一个数据范围而不是一个值  如age:10~20   搜索{"gle":5,"lte":20} 则可以搜索出来数据

支持的数据类型 说明

integer_range

 

float_range

 

long_range

 

double_range

 

date_range

64-bit 无符号整数,时间戳(单位:毫秒)

ip_range

IPV4 或 IPV6 格式的字符串

可选参数:

relation这只匹配模式

INTERSECTS 默认的匹配模式,只要搜索值与字段值有交集即可匹配到

WITHIN 字段值需要完全包含在搜索值之内,也就是字段值是搜索值的子集才搜索出来

CONTAINS 与WITHIN相反,只搜索字段值包含搜索值的文档

测试

1.添加index

put:127.0.0.1:9200/range_test

  1. {
  2. "mappings": {
  3. "_doc": {
  4. "properties": {
  5. "count": {
  6. "type": "integer_range"
  7. },
  8. "create_date": {
  9. "type": "date_range",
  10. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  11. }
  12. }
  13. }
  14. }
  15. }

2.添加测试数据

post:127.0.0.1:9200/range_test/_doc/1

  1. {
  2. "count" : {
  3. "gte" : 1,
  4. "lte" : 100
  5. },
  6. "create_date" : {
  7. "gte" : "2019-02-1 12:00:00",
  8. "lte" : "2019-03-30"
  9. }
  10. }

3.测试搜索

get:127.0.0.1:9200/range_test/_doc/_search

  1. {
  2. "query":{
  3. "term":{
  4. "count":5
  5. }
  6. }
  7. }

5在1~100之间可以搜索出来

  1. {
  2. "query" : {
  3. "range" : {
  4. "create_date" : {
  5. "gte" : "2019-02-01",
  6. "lte" : "2019-03-30",
  7. "relation" : "within"
  8. }
  9. }
  10. }
  11. }

Mapping复杂数据类型

数组类型 Array

支持字符串 数值 object对象数组   数组元素必须为相同数据类型

对象类型 Object

  1. {
  2. "name": "小明",
  3. "user_info": {
  4. "student_id": 111,
  5. "class_info": {
  6. "class_name": "1年级"
  7. }
  8. }
  9. }

被索引形式

  1. {
  2. "name":"小明",
  3. "user_info.student_id":"111",
  4. "user_info.student_info.class_name":"111"
  5. }

嵌套类型 Nested

能够支持数组元素单独的做索引

查询api:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

聚合api:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html

排序api:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html

检索和高亮:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html#nested-inner-hits

Nested和Object区别

put:127.0.0.1:9200/object_test/_doc/1 默认是object类型

  1. {
  2. "user_name":"小明",
  3. "subjects":[
  4. {"subject_name":"地理","id":1},
  5. {"subject_name":"英语","id":2}
  6. ]
  7. }

搜索名字为英语id为1的

  1. {
  2. "query":{
  3. "bool":{
  4. "must":[
  5. {"match":{"subjects.subject_name":"英语"}},
  6. {"match":{"subjects.id":"1"}}
  7. ]
  8. }
  9. }
  10. }

正常搜索不出来  测试时搜索出来了

因为索引为以下格式

  1. {
  2. "name":"小明",
  3. "subjects.subject_name":["英语","地理"],
  4. "subjects.subject_id":["1","2"]
  5. }

改为Nested 就不会

地理数据类型

geo_point

几种格式

object对象:"location": {"lat": 41.12, "lon": -71.34}

字符串:"location": "41.12,-71.34"

geohash:"location": "drm3btev3e86"

数组:"location": [ -71.34, 41.12 ]

geo_shape

查询api:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html

专用数据类型

  • 记录IP地址 ip
  • 实现自动补全 completion
  • 记录分词数 token_count
  • 记录字符串hash值 murmur3
  • Percolator

Mapping设置

一个完整的mapping设置

  1. {
  2. "settings": {
  3. "analysis": {
  4. "analyzer": {
  5. "ik_pinyin_analyzer": {
  6. "type": "custom",
  7. "tokenizer": "ik_smart",
  8. "filter": ["my_pinyin"]#自定义filter
  9. },
  10. "pinyin_analyzer": {
  11. "tokenizer": "shopmall_pinyin"
  12. },
  13. "first_py_letter_analyzer": {
  14. "tokenizer": "first_py_letter"
  15. },
  16. "full_pinyin_letter_analyzer": {
  17. "tokenizer": "full_pinyin_letter"
  18. },
  19. "onlyOne_analyzer": {
  20. "tokenizer": "onlyOne_pinyin"
  21. }
  22. },
  23. "tokenizer": {#自定义分词器
  24. "onlyOne_pinyin": {
  25. "type":"pinyin",
  26. "keep_separate_first_letter": "false",
  27. "keep_first_letter":"false"
  28. },
  29. "shopmall_pinyin": {
  30. "keep_joined_full_pinyin": "true",
  31. "keep_first_letter": "true",
  32. "keep_separate_first_letter": "false",
  33. "lowercase": "true",
  34. "type": "pinyin",
  35. "limit_first_letter_length": "16",
  36. "keep_original": "true",
  37. "keep_full_pinyin": "true",
  38. "keep_none_chinese_in_joined_full_pinyin": "true"
  39. },
  40. "first_py_letter": {
  41. "type": "pinyin",
  42. "keep_first_letter": true,
  43. "keep_full_pinyin": false,
  44. "keep_original": false,
  45. "limit_first_letter_length": 16,
  46. "lowercase": true,
  47. "trim_whitespace": true,
  48. "keep_none_chinese_in_first_letter": false,
  49. "none_chinese_pinyin_tokenize": false,
  50. "keep_none_chinese": true,
  51. "keep_none_chinese_in_joined_full_pinyin": true
  52. },
  53. "full_pinyin_letter": {
  54. "type": "pinyin",
  55. "keep_separate_first_letter": false,
  56. "keep_full_pinyin": false,
  57. "keep_original": false,
  58. "limit_first_letter_length": 16,
  59. "lowercase": true,
  60. "keep_first_letter": false,
  61. "keep_none_chinese_in_first_letter": false,
  62. "none_chinese_pinyin_tokenize": false,
  63. "keep_none_chinese": true,
  64. "keep_joined_full_pinyin": true,
  65. "keep_none_chinese_in_joined_full_pinyin": true
  66. }
  67. },
  68. "filter": {
  69. "my_pinyin": {
  70. "type": "pinyin",
  71. "keep_joined_full_pinyin": true,
  72. "keep_separate_first_letter":true
  73. }
  74. }
  75. }
  76.  
  77. },
  78. "mappings": {
  79. "doc": {#type名字
  80. "properties": {#mapping的属性
  81. "productName": {属性名字
  82. "type": "text",#属性类型
  83. "analyzer": "ik_pinyin_analyzer",#分词器
  84. "fields": {#fields 指定自定义分词器 查询时通过productName.keyword_once_pinyin 可以指定
  85. "keyword_once_pinyin": {
  86. "type": "text",
  87. "analyzer": "onlyOne_analyzer"#指定的自定义分词器
  88. }
  89. }
  90. },
  91. "skuNames": {
  92. "type": "text",
  93. "analyzer": "ik_pinyin_analyzer",
  94. "fields": {
  95. "keyword_once_pinyin": {
  96. "type": "text",
  97. "analyzer": "onlyOne_analyzer"
  98. }
  99. }
  100. },
  101. "regionCode": {
  102. "type": "keyword"
  103. },
  104. "productNameSuggester": {#es6.x搜索建议实现
  105. "type": "completion",
  106. "fields": {
  107. "pinyin": {
  108. "type": "completion",
  109. "analyzer": "pinyin_analyzer"
  110. },
  111. "keyword_pinyin": {
  112. "type": "completion",
  113. "analyzer": "full_pinyin_letter_analyzer"
  114. },
  115. "keyword_first_py": {
  116. "type": "completion",
  117. "analyzer": "first_py_letter_analyzer"
  118. }
  119. }
  120. }
  121. "info": {#es6父子类型设置
  122. "type": "join",
  123. "relations": {
  124. "md_product":[ "sl_customer_character_order_list","ic_product_store_account","sl_customer_product_setting"]
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }

创建mapping

put:http://127.0.0.1:9200/db

  1. {
  2. "mappings": {
  3. "product": {//type
  4. "properties": {
  5. "productName": {//字段
  6. "type": "text"//数据类型
  7. }
  8. }
  9. }
  10. }
  11. }

mapping参数

参数 说明
analyzer 分词器 默认:standard
boost 字段权重默认1 在通过_all字段查询 根据此字段来权重
dynamic 控制字段新增 true(默认 允许新增) false  strict 不能新增文档
index 控制字段是否索引(可搜索) true 是 false否

参考:https://www.jianshu.com/p/e8a9feea683c

查看当前索引的映射

http://127.0.0.1:9200/blogs2/product/_mapping

  1. {
  2. "blogs2": {
  3. "mappings": {
  4. "product": {
  5. "properties": {
  6. "price": {
  7. "type": "long"
  8. },
  9. "productName": {
  10. "type": "text",
  11. "fields": {
  12. "keyword": {
  13. "type": "keyword",
  14. "ignore_above": 256
  15. }
  16. }
  17. },
  18. "remark": {
  19. "type": "text",
  20. "fields": {
  21. "keyword": {
  22. "type": "keyword",
  23. "ignore_above": 256
  24. }
  25. }
  26. },
  27. "tags": {
  28. "type": "text",
  29. "fields": {
  30. "keyword": {
  31. "type": "keyword",
  32. "ignore_above": 256
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }

自定义映射

作用定义数据类型 比如数字映射成text 大于小于范围搜索就会无效 还有明确哪些fullText需要分词哪些不需要分词

确切值(Exact values)和全文本(FullText)

es支持很多种数据类型但是主要分为2大类
确切值就是能够确定的值 比如id 日期  通过=就能查询到我们想要的数据

而全文本是需要进行相似度匹配 返回最佳匹配

elasticsearch 权威指南Mapping(映射)的更多相关文章

  1. 初识Elastic search—附《Elasticsearch权威指南—官方guide的译文》

    本文作为Elastic search系列的开篇之作,简要介绍其简要历史.安装及基本概念和核心模块. 简史 Elastic search基于Lucene(信息检索引擎,ES里一个index—索引,一个索 ...

  2. Elasticsearch权威指南(中文版)

    Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...

  3. Elasticsearch 权威指南

    Elasticsearch 权威指南 http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html

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

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

  5. Elasticsearch 权威指南 NESTAPI地址

    Elasticsearch 权威指南:http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html NEST:http://n ...

  6. elasticsearch权威指南

    elasticsearch权威指南 https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/

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

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  8. Elasticsearch: 权威指南(官方教程)

    <Elasticsearch 权威指南>中文版 序言 前言 基础入门 深入搜索 处理人类语言 聚合 地理位置 数据建模 管理.监控和部署

  9. ElasticSearch权威指南学习(映射和分析)

    概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等).+ 分析(analysis)机制用于进行全文 ...

随机推荐

  1. 修改select默认样式

    http://www.qkzone.com/code/2015-11-26/1.html

  2. B1007 [HNOI2008]水平可见直线 几何

    其实就是一道很简单的栈,只要明白什么情况会被挡住就行了.假如斜率一样则下面的被挡住,假如不一样就算交点,看那个交点在上面就行了. 题干: Description 在xoy直角坐标平面上有n条直线L1, ...

  3. Ned的难题

    题目描述 Ned再也看不下去Robert的种种恶习,于是他决定出一道题来让他醒悟. Ned的题目是这样: 给出一个有n个数的序列,求其中所有连续子序列的数的最大公因数的乘积模1000000009的值. ...

  4. bzoj 1078 [SCOI2008]斜堆 —— 斜堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1078 考察斜堆的性质: 一个点如果没有左子树,也一定没有右子树: 看了这篇精美的博客:htt ...

  5. atcoder 076

    日本人的比赛 C:如果两个数差了大于1无解,否则分类讨论 #include<bits/stdc++.h> using namespace std; typedef long long ll ...

  6. PCB SQL SERVER 字段模糊匹配个数 实现方法

    今天工程系统给到加投加投组件的数据规则修改,遇到需将一个字段模糊匹配的个数统计 这类需求要平时应该很少遇到了,这里将此方法分享出来, 一.需求如下 例子:itempara字段中的内容是: IVH板 铜 ...

  7. ecshop的一些东西,来看看

    \includes\lib_commom.php =>公用函数库 \includes\lib_main.php =>前台公用函数库 \includes\lib_init.php => ...

  8. Android从Camera中获取图片的两种方法

    方法一: 此方法会由Camera直接产生照片回传给应用程序,但是返回的是压缩图片,显示不清晰 ? 1 2 3 4 5 6 try {      Intent cameraIntent = new In ...

  9. 355 Design Twitter 设计推特

    设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文.你的设计需要支持以下的几个功能:    postTweet(userI ...

  10. MVC系列学习(十一)-客户端的验证

    1.通过一个实例,来了解MVC中强大的验证功能 1.1新建一个 [基本] 的mvc项目,因为要用到验证的js,然后在一个视图中写上一下代码,以及Model中的代码如下 [注]在调用html.EditF ...