ELK高级搜索四之Mapping映射

2023-11-03

目录

Mapping映射入门

什么是mapping映射?

内置映射类型

keyword 使用  

创建Mapping

新增数据 

查询测试

属性介绍 

store使用 

 创建索引

动态映射dynamic mapping

手动创建映射

   查询映射 

 映射测试

修改映射

分词器的介绍和使用

什么是分词器

standard analyzer

simple analyzer

whitespace analyzer

stop analyzer

中文分词器


Mapping映射入门

什么是mapping映射?

映射:创建索引的时候,可以预先定义字段的类型以及相关属性
elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索
作用:会让索引建立的更加细致和完善

类型:静态映射和动态映射

内置映射类型

类型 字段类型
string类型

text 和 keyword两种

text类型:会进行 分词,抽取词干,建立倒排索引

keyword类型:一个普通字符串,只能完全匹配才能搜索到

数字类型 long,integer,short,byte,double,float
日期类型 date
bool(布尔)类型 boolean
binary(二进制)类型 binary
复杂类型 object,nested
geo(地区)类型 geo-point,geo-shape
专业类型 ip,competion

keyword 使用  

创建Mapping
PUT /book_index
{
  "mappings": {
    "properties": {
     "bookName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword"
            }
          },
          "analyzer" : "ik_max_word",
          "search_analyzer" : "ik_smart"
        }
    }
  }
}
新增数据 
POST /book_index_test/_doc/110000
{
  "bookName":"三少爷的剑"
}
查询测试
GET /book_index_test/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "bookName.keyword": "三少爷的剑"
          }
        }
      ]
    }
  }
}

# 查询输出
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 8.873095,
    "hits" : [
      {
        "_index" : "book_index_test",
        "_type" : "_doc",
        "_id" : "110000",
        "_score" : 8.873095,
        "_source" : {
          "bookName" : "三少爷的剑"
        }
      }
    ]
  }
}

属性介绍 

属性 描述 适合类型
store 值为true表示存储,为false 表示不存储,默认为false all
index true表示分析,false表示不分析,默认为true string
null_value 如果字段为空,可以设置一个默认值,比如:“NA” all
analyzer

可以设置索引和搜索时用的分析器,默认使用的是

standard分析器,还可以使用whitespace, simple ,english

all
include_in_all 默认ES为每个文档定义一个特殊域_all, 它的作用是让每个字段被搜索到,如果不想某个字段被搜索到,可以设置false all
format 时间格式字符串的模式 date

更多属性:Mapping parameters | Elasticsearch Guide [8.2] | Elastic 

store使用 

默认情况下,对字段值进行索引以使其可搜索,但不会存储这些值。这意味着可以查询字段,但无法检索原始字段值。

通常这并不重要。字段值已经是默认存储的源字段的一部分。如果只想检索单个字段或几个字段的值,而不是整个源,那么可以通过源筛选来实现。

在某些情况下,存储字段是有意义的。例如,如果您有一个包含标题、日期和非常大的内容字段的文档,您可能希望只检索标题和日期,而不必从大型源字段中提取这些字段,例如:小说章节内容的文档存储。

创建章节Mapping 
PUT /chapter_index_test/_mapping
{
    "properties": {
      "id": {
        "type": "integer",
        "store": true 
      },
      "position": {
        "type": "integer",
        "store": true 
      },
      "title": {
        "type": "text",
        "store": true 
      },
      "content": {
        "type": "text"
      }
    }
}
新增文档 
PUT chapter_index_test_v1/_doc/1
{
  "id": 1,
  "position": 1,
  "title": "第一章",
  "content": "创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索"
}
查询文档 
GET my-chapter_index_test_v3/_search?q=title:第一
{
  "stored_fields": [ "id", "position","title"] 
}

 创建索引

#创建索引(设置字段类型)
PUT jobbole                         #创建索引设置索引名称
{
  "mappings": {                     #设置mappings映射字段类型
    "job": {                        #表名称
      "properties": {               #设置字段类型
        "title":{                   #title字段
          "type": "text"            #text类型,text类型可以分词,建立倒排索引
        },
        "salary_min":{              #salary_min字段
          "type": "integer"         #integer数字类型
        },
        "city":{                    #city字段
          "type": "keyword"         #keyword普通字符串类型
        },
        "company":{                 #company字段,是嵌套字段
          "properties":{            #设置嵌套字段类型
            "name":{                #name字段
              "type":"text"         #text类型
            },
            "company_addr":{        #company_addr字段
              "type":"text"         #text类型
            },
            "employee_count":{      #employee_count字段
              "type":"integer"      #integer数字类型
            }
          }
        },
        "publish_date":{            #publish_date字段
          "type": "date",           #date时间类型
          "format":"yyyy-MM-dd"     #yyyy-MM-dd格式化时间样式
        },
        "comments":{                #comments字段
          "type": "integer"         #integer数字类型
        }
      }
    }
  }
}



#保存文档(相当于数据库的写入数据)
PUT jobbole/job/1                       #索引名称/表/id
{
  "title":"python分布式爬虫开发",       #字段名称:字段值
  "salary_min":15000,                   #字段名称:字段值
  "city":"北京",                        #字段名称:字段值
  "company":{                           #嵌套字段
    "name":"百度",                      #字段名称:字段值
    "company_addr":"北京市软件园",      #字段名称:字段值
    "employee_count":50                 #字段名称:字段值
  },
  "publish_date":"2017-4-16",           #字段名称:字段值
  "comments":15                         #字段名称:字段值
}

动态映射dynamic mapping

插入几条数据,es会自动为我们建立一个索引,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置
// 创建文档请求
PUT  localhost:9200/blog/_doc/1
{
    "title":"内蒙古科右中旗:沃野千里织锦绣---修改操作",
    "description":"内蒙古兴安盟科右中旗巴彦呼舒镇乌逊嘎查整洁的村容村貌。近年来,内蒙古自治区兴安盟科尔沁右翼中旗按照“产业兴旺、生态宜居、乡风文明、治理有效、生活富裕”的总要求,坚持科学规划、合理布...国际在线",
    "publish_time":"2020-07-08"
}

   查看动态映射

GET  http://localhost:9200/blog/_mapping

{
  "blog" : {
    "mappings" : {
      "properties" : {
        "description" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "id" : {
          "type" : "long"
        },
        "publish_time" : {
          "type" : "date"
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

手动创建映射

  创建索引

PUT http://localhost:9200/book

{
  "acknowledged" : true
}

创建映射  

PUT localhost:9200/book/_mapping
{
    "properties":{
        "name":{
            "type":"text"
        },
        "description":{
            "type":"text",
            "analyzer":"english",
            "search_analyzer":"english"
        },
        "pic":{
            "type":"text",
            "index":"false"
        },
        "publish_time":{
            "type":"date"
        }
    }
}

   查询映射 

GET   localhost:9200/blog/_mapping
{
    "blog": {
        "mappings": {
            "properties": {
                "description": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "id": {
                    "type": "long"
                },
                "publish_time": {
                    "type": "date"
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

 映射测试

插入文档

PUT localhost:9200/book/_doc/1
{
  "name":"Java核心技术",
  "description":"本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),是程序员的优选Java指南。本版针对Java SE 9、10和 11全面更新。",
  "pic":"item.jd.com",
  "publish_time":"2022-04-19"
}



{
  "_index" : "book",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

  测试查询  localhost:9200/book/_search?q=name:java

GET localhost:9200/book/_search?q=name:java

{
    "took": 1126,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "book",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "name": "Java核心技术",
                    "description": "本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),是程序员的优选Java指南。本版针对Java SE 9、10和 11全面更新。",
                    "pic": "item.jd.com",
                    "publish_time": "2022-04-19"
                }
            }
        ]
    }
}

    测试查询  localhost:9200/book/_search?q=description:java

GET localhost:9200/book/_search?q=description:java

{
    "took": 15,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.45390707,
        "hits": [
            {
                "_index": "book",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.45390707,
                "_source": {
                    "name": "Java核心技术",
                    "description": "本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),是程序员的优选Java指南。本版针对Java SE 9、10和 11全面更新。",
                    "pic": "item.jd.com",
                    "publish_time": "2022-04-19"
                }
            }
        ]
    }
}

    测试查询 localhost:9200/book/_search?q=pic:www.jd.com

GET localhost:9200/book/_search?q=pic:item.jd.com

{
    "took": 8,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}
通过测试发现:name和description都支持全文检索,pic不可作为查询条件。

修改映射

只能在创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping。
因为已有数据按照映射早已分词存储好。如果修改,那这些存量数据怎么办。
新增一个字段mapping

PUT localhost:9200/book/_mapping
{
    "properties":{
        "ISBN":{
            "type":"text",
            "fields":{
                "raw":{
                    "type":"keyword"
                }
            }
        }
    }
}

   修改数据

PUT localhost:9200/book/_doc/1
{
  "name":"Java核心技术",
  "description":"本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),是程序员的优选Java指南。本版针对Java SE 9、10和 11全面更新。",
  "pic":"item.jd.com",
  "publish_time":"2022-04-19",
  "ISBN":"12800420"
}

  搜索ISBN

GET localhost:9200/book/_search?q=ISBN:12800420

{
    "took": 949,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "book",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "name": "Java核心技术",
                    "description": "本书由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),是程序员的优选Java指南。本版针对Java SE 9、10和 11全面更新。",
                    "pic": "item.jd.com",
                    "publish_time": "2022-04-19",
                    "ISBN": "12800420"
                }
            }
        ]
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ELK高级搜索四之Mapping映射 的相关文章

  • 如何使用 Apache POI API 将图像添加到 pptx 中添加的图像占位符?

    我已经预定义了带有文本和图像占位符的 pptx 模板 我如何从模板访问和修改这些占位符 我可以使用 POI pptx API 直接将图像和文本添加到幻灯片中 但如何将其添加到模板的占位符中 请参阅链接以了解如何添加占位符来创建固定模板 ht
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 我可以使用子接口重新编译公共 API 并保持二进制兼容性吗?

    我有一个公共 API 在多个项目中多次使用 public interface Process
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • [Java]在数组中查找一个数字并返回其下标值

    此代码仅用于数组为非递减序列 二分查找 public class BinarySearch public static int binarySearch int array int target int left 0 int right a
  • PTA8(python)

    python程序设计选做题集 函数题和编程题 6 1 用类来计算圆面积 10 分 6 2 统计商品总价 20 分 6 3 定义商品类 特殊方法 30 分 6 4 学生成绩管理 30 分 6 5 设计一个股票类 高教社 Python编程基础及
  • STM32F429点亮led实验

    一 调用的函数 在stm32f429中点亮led通过控制引脚的高低电平来实现 在f429的hal库中控制引脚高低电平的函数 void HAL GPIO WritePin GPIO TypeDef GPIOx uint16 t GPIO Pi
  • 笔记-CDN

    转自 http www jianshu com p df806e04b204 转自 http blog qiniu com archives 6221 从 CDN 到 LiveNet 随着基础设施的升级 我们从文字时代演进到读图时代 又从读
  • nb传输协议和服务器的连接,NB-iot网络架构介绍_NB-iot的数据传输方式

    一 NB iot网络架构 整个NB IoT网络架构分为五个部分 终端 无线网络 核心网络 EPC IoT支持平台和应用服务器 二 NB iot网络架构简介 1 终端 主要通过空中接口连接到基站 终端方面主要包括工业终端和NB IoT模块 工
  • Node.js程序如何访问MySQL数据库呢?Sequelize操作MySQL数据库详解

    使用Sequelize 访问MySQL 当我们安装好MySQL后 Node js程序如何访问MySQL数据库呢 访问MySQL数据库只有一种方法 就是通过网络发送SQL命令 然后 MySQL服务器执行后返回结果 我们可以在命令行窗口输入my
  • 以太坊未来的 POS 协议:Casper

    以太坊未来的 POS 协议 大家好 我是Vlad 2014年9月份我开始了研究和设计以太坊POS proof of stake 权益证明 架构的工作 目前Vitalik和我对于Serenity阶段的POS协议应该长什么样已经有了许多共识 只
  • 证券市场的法律法规体系

    前言 作为金融公司的一员 这个证券从业资格证还是要拿到手 虽然我是技术人员 但这方面的知识还是要加强 要懂法 哈哈 已经报名了6月24号的考试 还有50天左右的时间 从今天起就记录下 我自己的学习笔记吧 Come on 证券市场法律法规体系
  • iis 配置多域名,多https

    当一个https的请求到达IIS服务器时 https请求为加密状态 需要拿到相应的服务器证书解密请求 由于每个站点对应的证书不同 服务器需要通过请求中不同的主机头来判断需要用哪个证书解密 然而主机头作为请求的一部分也被加密 最终IIS只好使
  • DAS、NAS、SAN、iSCSI 存储方案概述

    目前服务器所使用的专业存储方案有DAS NAS SAN iSCSI几种 存储根据服务器类型可以分为 封闭系统的存储和开放系统的存储 1 封闭系统主要指大型机 2 开放系统指基于包括Windows UNIX Linux等操作系统的服务器 开放
  • 鱼眼图像的全景矫正

    1 球面透视投影与展开 鱼眼镜头的成像通常首先要进行球面透视投影 即将三维空间中的点沿着经过镜头光学中心的直线投影到以光心为原点的单位半径球体 内表面 上 从而球面上的每一个点 可通过相应的经纬度来表示 如图 1 所示 以镜头光学中心为原点
  • vue2.x自定义v-loading指令

    vue3 x自定义v loading思路类似 directive js import Loading from loading import Vue from vue const loadingDirective inserted el b
  • 排查Javascript内存泄漏案例(一)

    Chrome DevTools里的Performance面板和Memory面板可以用来定位内存问题 如何判断应用发生内存泄漏 为了证明螃蟹的听觉在腿上 一个专家捉了只螃蟹并冲它大吼 螃蟹很快就跑了 然后捉回来再冲它吼 螃蟹又跑了 最后专家把
  • Linux 创建用户并限制其访问目录,设置密码为永不过期

    创建用户及访问目录 useradd sou d tmp sou M 设置用户密码 passwd sou Tip 输入命令后 会提示输入密码 修改密码为永不过期 chage M 99999 sou 将访问目录和所有子目录权限全部赋予用户 ch
  • 十二、Linux系统中的软件管理

    十二 Linux 系统中的软件管理 rpm dnf命令 软件仓库的搭建 12 1 Linux中软件包的类型 1 DEB UBlinux DEBlinux 2 RPM redhat centOS fadora 3 bz2 gz xz 1 需要
  • Linux root用户使用普通用户的conda环境的方法

    1 使用root用户登录 2 假设普通用户为new user conda环境安装在new user用户目录下 则可以使用如下命令激活conda环境 source home new user miniconda3 bin activate 激
  • 联想小新I1000 win10电脑系统安装教程

    最近因为之前电脑太卡了 想要给自己的联想小新重装系统 发现网上说采用以下方式安装的win10系统会更干净一些 过程做以下记录 联想小新 win10电脑系统安装教程 1 制作系统安装盘 1 1 准备U盘以及一台用来制作安装盘的电脑 1 2 下
  • 通过遍历,找到链表中最后一个结点

    通过遍历 找到链表中最后一个结点 首先创建一个链表 然后再找到链表的最后一个结点 代码实例 class Node public int val public Node next public Node int val this val va
  • ffmpeg将连续的h264分割为单帧

    http ffmpeg org doxygen trunk decode video 8c example html FFmpeg Main Page Related Pages Modules Namespaces Data Struct
  • ELK高级搜索四之Mapping映射

    目录 Mapping映射入门 什么是mapping映射 内置映射类型 keyword 使用 创建Mapping 新增数据 查询测试 属性介绍 store使用 创建索引 动态映射dynamic mapping 手动创建映射 查询映射 映射测试