Mapping简介

mapping 是用来定义文档及其字段的存储方式、索引方式的手段,例如利用mapping 来定义以下内容:

  • 哪些字段需要被定义为全文检索类型
  • 哪些字段包含numberdate类型等
  • 格式化时间格式
  • 自定义规则,用于控制动态添加字段的映射

Mapping Type

每个索引都拥有唯一的 mapping type,用来决定文档将如何被索引。mapping type由下面两部分组成

  • Meta-fields
    元字段用于自定义如何处理文档的相关元数据。 元字段的示例包括文档的_index,_type,_id和_source字段。

  • Fields or properties
    映射类型包含与文档相关的字段或属性的列表。

分词器最佳实践

因为后续的keywordtext设计分词问题,这里给出分词最佳实践。即索引时用ik_max_word,搜索时分词器用ik_smart,这样索引时最大化的将内容分词,搜索时更精确的搜索到想要的结果。

例如我想搜索的是小米手机,我此时的想法是想搜索出小米手机的商品,而不是小米音响、小米洗衣机等其他产品,也就是说商品信息中必须只有华为手机这个词。

我们后续会使用"search_analyzer": "ik_smart"来实现这样的需求。

字段类型

  • 一种简单的数据类型,例如textkeyworddoublebooleanlongdateip类型。
  • 也可以是一种分层的json对象(支持属性嵌套)。
  • 也可以是一些不常用的特殊类型,例如geo_pointgeo_shapecompletion

针对同一字段支持多种字段类型可以更好地满足我们的搜索需求,例如一个string类型的字段可以设置为text来支持全文检索,与此同时也可以让这个字段拥有keyword类型来做排序和聚合,另外我们也可以为字段单独配置分词方式,例如"analyzer": "ik_max_word",

text 类型

text类型的字段用来做全文检索,例如邮件的主题、淘宝京东中商品的描述等。这种字段在被索引存储前先进行分词,存储的是分词后的结果,而不是完整的字段。text字段不适合做排序和聚合。如果是一些结构化字段,分词后无意义的字段建议使用keyword类型,例如邮箱地址、主机名、商品标签等。

常有参数包含以下

  • analyzer:用来分词,包含索引存储阶段搜索阶段(其中查询阶段可以被search_analyzer参数覆盖),该参数默认设置为index的analyzer设置或者standard analyzer
  • index:是否可以被搜索到。默认是true
  • fields:Multi-fields允许同一个字符串值同时被不同的方式索引,例如用不同的analyzer使一个field用来排序和聚类,另一个同样的string用来分析和全文检索。下面会做详细的说明
  • search_analyzer:这个字段用来指定搜索阶段时使用的分词器,默认使用analyzer的设置
  • search_quote_analyzer:搜索遇到短语时使用的分词器,默认使用search_analyzer的设置

keyword 类型

keyword用于索引结构化内容(例如电子邮件地址,主机名,状态代码,邮政编码或标签)的字段,这些字段被拆分后不具有意义,所以在es中应索引完整的字段,而不是分词后的结果。

通常用于过滤(例如在博客中根据发布状态来查询所有已发布文章),排序和聚合。keyword只能按照字段精确搜索,例如根据文章id查询文章详情。如果想根据本字段进行全文检索相关词汇,可以使用text类型。

PUT my_index { "mappings": { "properties": { "tags": { "type": "keyword" } } } }

  • index:是否可以被搜索到。默认是true
  • fields:Multi-fields允许同一个字符串值同时被不同的方式索引,例如用不同的analyzer使一个field用来排序和聚类,另一个同样的string用来分析和全文检索。下面会做详细的说明

  • null_value:如果该字段为空,设置的默认值,默认为null

  • ignore_above:设置索引字段大小的阈值。该字段不会索引大小超过该属性设置的值,默认为2147483647,代表着可以接收任意大小的值。但是这一值可以被PUT Mapping Api中新设置的ignore_above来覆盖这一值。

date类型

支持排序,且可以通过format字段对时间格式进行格式化。

json中没有时间类型,所以在es在规定可以是以下的形式:

  • 一段格式化的字符串,例如"2015-01-01"或者"2015/01/01 12:10:30"
  • 一段long类型的数字,指距某个时间的毫秒数,例如1420070400001

  • 一段integer类型的数字,指距某个时间的秒数

object类型

mapping中不用特意指定field为object类型,因为这是它的默认类型。

json类型天生具有层级的概念,文档内部还可以包含object类型进行嵌套。例如:

PUT my_index { "mappings": { "properties": { "region": { "type": "keyword" }, "manager": { "properties": { "age": { "type": "integer" }, "name": { "properties": { "first": { "type": "text" }, "last": { "type": "text" } } } } } } } }

nest类型

nest类型是一种特殊的object类型,它允许object可以以数组形式被索引,而且数组中的某一项都可以被独立检索。

而且es中没有内部类的概念,而是通过简单的列表来实现nest效果,例如下列结构的文档:

上面格式的对象会被按照下列格式进行索引,因此会发现一个user中的两个属性值不再匹配,alicewhite失去了联系

range类型

支持以下范围类型:

类型 范围
integer_range -2的31次 到 2的31次-1.
float_range 32位单精度浮点数
long_range -2的63次 到 2的63次-1.
double_range 64位双精度浮点数
date_range unsigned 64-bit integer milliseconds
ip_range ipv4和ipv6或者两者的混合

实战:同时使用keyword和text类型

注:term是查询时对关键字不分词,keyword是索引时不分词

上述我们讲解过keywordtext一个不分词索引,一个是分词后索引,我们利用他们的fields属性来让当前字段同时具备keywordtext类型。

首先我们创建索引并指定mapping,为title同时设置keywordtext属性

我们已经往es中插入以下数据

_index _type _id _score itemId title desc num Price
idx_item _doc rvsX-W4Bo-iJGWqbQ8dk 1 1 苏泊尔煮饭SL3200 让煮饭更简单,让生活更快乐 100 200
idx_item _doc sPsY-W4Bo-iJGWqbscfU 1 3 厨房能手威猛先生 你煲粥,我洗锅 100 30
idx_item _doc r_sX-W4Bo-iJGWqbhMew 1 2 苏泊尔煲粥好能手型号SL322 你煲粥,我煲粥,我们一起让煲粥更简单 100 190

title=”苏泊尔煮饭SL3200“ 根据text以及最细粒度分词设置"analyzer": "ik_max_word",在es中按照以下形式进行索引存储

title.keyword=”苏泊尔煮饭SL3200因为不分词,所以在es中索引存储形式为

我们首先对title.keyword进行搜索,只能搜索到第一条数据,因为match搜索会将关键字分词然后去搜索,分词后的结果包含"苏泊尔煮饭SL3200"所以搜索成功,我们将搜索关键字改为苏泊尔煮饭等都不会查到数据。

我们改用term搜索,他搜索不会分词,正好与es中的数据精准匹配,也只有第一条数据,我们将搜索关键字改为苏泊尔煮饭等都不会查到数据。

我们继续对title使用match进行查询,结果查到了第一条和第三条数据,因为它们在es中被索引的数据包含苏泊尔关键字

我们如果搜索苏泊尔煮饭SL3200会发现没有返回数据,因为title在索引时没有苏泊尔煮饭SL3200这一项,而term时搜索关键字也不分词,所以无法匹配到数据。但是我们将内容改为苏泊尔时,就可以搜索到第一条和第三条内容,因为第一条和第三条的title被分词后的索引包含苏泊尔字段,所以可以查出第一三条。

实战:格式化时间、以及按照时间排序

我们创建索引idx_pro,将mytimestampcreateTime字段分别格式化成两种时间格式

插入四组样本数据

我们可以使用sort参数来进行排序,并且支持数组形式,即同时使用多字段排序,只要改为[]就行

我们也可以使用range参数来搜索指定时间范围内的数据,当然range也支持integerlong等类型

elasticsearch中mapping全解实战相关推荐

  1. Elasticsearch之Mapping设置详解

    Elasticsearch之Mapping详解 什么是Mapping? 字段的数据类型 Dynamic Mapping ES类型自动识别机制 更新mapping 定义Mapping 1.控制字段是否被 ...

  2. js系列教程11-json、ajax(XMLHttpRequest)、comet、SSE、WebSocket全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  3. Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)

    本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目关于Form的定义,如何激活一个form或者使当前运行的form进入不激活状态,如何在 ...

  4. NLP中的Mask全解

    ©PaperWeekly 原创 · 作者|海晨威 学校|同济大学硕士生 研究方向|自然语言处理 Mask 在 NLP 中是一个很常规的操作,也有多种应用的场景和形式,下面尝试从以下几个方面去全解(用了 ...

  5. html+css+js适合前端小白的实战全解(超详细)——2048小游戏(三)

    续上一小节,我们回到newgame()这个函数,我们之前只做了init()内函数,相当于一个初始化操作 现在,我们需要再随机两个两个生成数字. 随机生成数字在这个游戏里会经常出现,用户移动一步,也会产 ...

  6. Elasticsearch 5.4 Mapping详解

    为什么80%的码农都做不了架构师?>>>    前言 一Field datatype字段数据类型 1string类型 2 text类型 3 keyword类型 4 数字类型 5 Ob ...

  7. 语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab

    语义分割中的深度学习方法全解:从FCN.SegNet到各版本DeepLab 原文:https://www.sohu.com/a/155907339_610300 图像语义分割就是机器自动从图像中分割出 ...

  8. python100个必背知识-python编程面试中必考的知识点,数据类型全解,笔记超全面...

    原标题:python编程面试中必考的知识点,数据类型全解,笔记超全面 python作为一门高级编程语言,它的定位是优雅.明确和简单.阅读Python编写的代码感觉像在阅读英语一样,这让使用者可以专注于 ...

  9. python中的format什么意思中文-Python中format()格式输出全解

    格式化输出:format() format():把传统的%替换为{}来实现格式化输出 1.使用位置参数:就是在字符串中把需要输出的变量值用{}来代替,然后用format()来修改使之成为想要的字符串, ...

最新文章

  1. 2020-08-23 W7电脑锁屏后,能让电脑处于运行状态吗?
  2. python添加、修改、删除、访问类对象属性的2种方法
  3. java队列课程_Java 实例 – 队列(Queue)用法
  4. 算法(4)-leetcode-explore-learn-数据结构-数组2
  5. coordinatorlayout_一篇文章学会Coordinatorlayout+AppbarLayout
  6. canvas笔记-画一片星空
  7. 分享正在构想的开源门户/B2B框架理念 与现有流行的门户系统/B2B系统有很大不同...
  8. Maven搭建SpringMVC+Hibernate项目详解
  9. android音频框架
  10. 网络工程师试题(二)2020-12-8
  11. 《从容一生》俞敏洪 书摘
  12. Hadoop HA HDFS启动错误之org.apache.hadoop.ipc.Client: Retrying connect to server问题解决
  13. ENVI分类格式转TIF
  14. Python3 大型网络爬虫实战 003 — scrapy 大型静态图片网站爬虫项目实战 — 实战:爬取 169美女图片网 高清图片
  15. 梦想贩卖机v2-1.069
  16. rampUp时间 jmeter
  17. 齐博免费 mysql_pconnect_齐博CMS:免费PHP+mysql 100M空间
  18. 线程池函数1 - 异步调用函数
  19. 前端图片在线转换Base64 图片编码Base64
  20. SQL注入-验证码处理

热门文章

  1. 装逼绝学!利用c++制作纸牌游戏,完爆赌神的扑克绝技!
  2. 基于hexo框架快速从0到1搭建个人博客----文章写作(四)
  3. 途牛网php笔试题,2018秋招途牛笔试试题分享,期待春招offer!
  4. 用了几年的postman,原来只用了皮毛~
  5. 图解Topo拓扑排序 例题洛谷P4017 最大食物链计数
  6. 2020武汉大学计算机学院夏令营面经
  7. OneNote——随心所欲记事本
  8. Android轻量级数据SparseArray详解
  9. 【华人学者风采】陈晓峰 西安电子科技大学
  10. html语言怎么改变文字大小,如何设置css中字体大小?