设为首页 收藏本站
查看: 1642|回复: 0

[经验分享] 关于elasticsearch的mapping简介

[复制链接]

尚未签到

发表于 2019-1-29 08:24:31 | 显示全部楼层 |阅读模式
  最近在玩elk,发现许多不了解的东西,虽然网上资料很多,但基本都乱且杂,通俗易懂的资料就显得尤为珍贵。
  网上发现这篇文章不错,以通俗易懂的语言讲明白了mapping的概念。
  默认mapping
  Elasticsearch(简称ES)是一个schema-less的系统,但并不代表no shema,当我们执行以下命令:
curl -XPUT http://localhost:9200/test/item/1 -d '{"name":"zach", "description": "A Pretty cool guy."}'  ES能非常聪明的识别出"name"和"description"字段的类型是string, ES默认会创建以下的mapping。
curl -XPUT 'http://localhost:9200/test/_mapping'  

  
mappings: {
  
    item: {
  
        properties: {
  
            description: {
  
                type: text
  
            }
  
            name: {
  
                type: text
  
            }
  
        }
  
    }
  
}
  什么是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" : "a",
  
      "start_offset" : 0,
  
      "end_offset" : 1,
  
      "type" : "",
  
      "position" : 0
  
    },
  
    {
  
      "token" : "pretty",
  
      "start_offset" : 2,
  
      "end_offset" : 8,
  
      "type" : "",
  
      "position" : 1
  
    },
  
    {
  
      "token" : "cool",
  
      "start_offset" : 9,
  
      "end_offset" : 13,
  
      "type" : "",
  
      "position" : 2
  
    },
  
    {
  
      "token" : "guy",
  
      "start_offset" : 14,
  
      "end_offset" : 17,
  
      "type" : "",
  
      "position" : 3
  
    }
  
  ]
  
}
  可以看到, 我们的description字段的值转换成了[a],[pretty], [cool], [guy], 在转换过程中‘标点符号’都被filter过滤掉了, A、Pretty也转成了全小写的a、pretty, 这里比较重要的是, 即使ES存储数据的时候仍然存储的是完整的数据, 但是可以搜索到这条数据的关键字只剩下这四个单词了, 其他的都是抛弃掉了。
  看看以单词a来搜索的结果:
curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{  
    "query" : {
  
        "term" : { "description": "a" }
  
    }
  
}'
  

  

  
{
  
  "took" : 14,
  
  "timed_out" : false,
  
  "_shards" : {
  
    "total" : 5,
  
    "successful" : 5,
  
    "failed" : 0
  
  },
  
  "hits" : {
  
    "total" : 1,
  
    "max_score" : 0.2876821,
  
    "hits" : [
  
      {
  
        "_index" : "test",
  
        "_type" : "item",
  
        "_id" : "1",
  
        "_score" : 0.2876821,
  
        "_source" : {
  
          "name" : "zach",
  
          "description" : "A Pretty cool guy."
  
        }
  
      }
  
    ]
  
  }
  
}
  这是一个公认的简单例子, 但是它描述了ES是如何工作的, 不要把mapping想成是数据类型, 把它想象成是搜索数据的指令集合。
  转自http://blog.csdn.net/lvhong84/article/details/23936697
  里面貌似是es1.x或2.x版本,内容稍有修改:
  1、说是A会被过滤掉,且查询时无法查出
  2、查询时用的字段为 text,而不是 term



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668940-1-1.html 上篇帖子: (一)Elasticsearch 下篇帖子: Elasticsearch索引定时清理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表