zoukankan      html  css  js  c++  java
  • Elasticsearch系列---初识mapping

    概要

    本篇简单介绍一下field数据类型mapping的相关知识。

    mapping是什么?

    前面几篇的实战案例,我们向Elasticsearch索引数据时,只是简单地把JSON文本放在请求体里,至于JSON里的field类型,存储到ES里是什么类型,中间是怎么做的映射,这个映射过程,就是mapping要解决的问题。

    mapping简单来说,就是解决JSON文本内容到field类型映射关系的定义。将时间域视为时间类型,数字视为数字类型,字符串识别为全文或精确值字符串,这个识别的过程,叫做mapping。

    Elasticsearch支持的简单域类型,类似于Java的基础数据类型,有如下几种:

    • 字符串:text,keyword
    • 整数 : byte, short, integer, long
    • 浮点数: float, double
    • 布尔型: boolean
    • 日期: date

    当Elasticsearch收到JSON基本数据类型内容时,使用如下规则进行类型映射:

    JSON type domain type
    布尔型: true 或者 false boolean
    整数: 123 long
    浮点数: 123.45 double
    日期格式的字符串: 2014-09-15 date
    字符串: love you text

    查看映射

    每个索引都可以通过/_mapping查询各个field的映射结果,ES本身有自动mapping的过程,但mapping后的结果一定要仔细检查一下。

    查询请求:

    GET /music/_mapping/children

    响应结果:

    {
      "music": {
        "mappings": {
          "children": {
            "properties": {
              "content": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "language": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                },
                "fielddata": true
              },
              "length": {
                "type": "long"
              },
              "likes": {
                "type": "long"
              },
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      }
    }
    

    mapping中就自动定义了每个field的数据类型,properties下面的是各个field字段的名称、类型等信息,text类型的还带一个keyword子field。

    数据类型的分词规则

    index在建立时或索引数据时,如果没有手动指定mapping信息,Elasticsearch会用它的规则自动为我们创建type信息,以及type对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。

    不同类型的field,有的是精确搜索(exact value),有的是全文搜索(full text)。

    • exact value,在建立倒排索引的时候,是将整个值一起作为一个关键词建立到倒排索引中的,并且大小写敏感;
    • full text,会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中。

    在一个搜索请求过来的时候,对exact value field和full text field进行搜索的会与当初建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索,这样才能达到预期的搜索效果。

    ES基本的几种field类型,除了text是使用full text,其他的都是exact value,总结来说mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为。

    自定义映射

    基本数据类型基本够用,但是有些数据可能需要自定义映射,尤其是字符串,string类型默认是full text,但是我们可以自己定义分词器,不同的分词器,会带来不一样的搜索效果,string类型最重要的属性是index和analyzer。

    index

    这个属性控制字符串的索引规则,有三个值可供选择:

    • true:支持索引,并且依据当前类型决定是全文搜索还是精确匹配
    • false:不索引

    例如:

    {
        "author": {
            "type":     "text",
            "index":    true
        }
    }
    

    analyzer

    这个属性控制字符串使用的分词器,在支持中文的系统里,这个属性经常被用到,各路分词器大显身手,都需要用这个属性来指定,如:

    {
        "content": {
            "type":     "text",
            "analyzer":    "aliws"
        }
    }
    

    测试映射

    我们在建立索引之后,可以通过测试命令来查看不同的field的映射结果,即full text类型的是否有分词, exact value的是否原样保留,text的内容可以随意输入,当把这个作用工具调试时,可以诊断的内容的分词情况,举例如下:

    1. full text类型
    GET /music/_analyze
    {
      "field": "content",
      "text": "let me sleep" 
    }
    

    结果:

    {
      "tokens": [
        {
          "token": "let",
          "start_offset": 0,
          "end_offset": 3,
          "type": "<ALPHANUM>",
          "position": 0
        },
        {
          "token": "me",
          "start_offset": 4,
          "end_offset": 6,
          "type": "<ALPHANUM>",
          "position": 1
        },
        {
          "token": "sleep",
          "start_offset": 7,
          "end_offset": 12,
          "type": "<ALPHANUM>",
          "position": 2
        }
      ]
    }
    
    1. exact value类型
    GET /music/_analyze
    {
      "field": "content.keyword",
      "text": "let me sleep" 
    }
    

    结果:

    {
      "tokens": [
        {
          "token": "let me sleep",
          "start_offset": 0,
          "end_offset": 12,
          "type": "word",
          "position": 0
        }
      ]
    }
    

    注意一个小细节:Elasticsearch在自动创建text类型时,为full text,但会自动建立一个keywork子field,这个子field是exact value类型的。

    小结

    本篇主要介绍了一个mapping的概念,基础数据类型,以及查看映射信息和测试field映射效果的方法,测试映射效果算是一个比较有用的工具,后期实际开发中,遇到需要诊断的内容,可以用这个工具协助排查问题。

    专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区
    Java架构社区

  • 相关阅读:
    CStringArray序列化处理
    【转】C++ Incorrect Memory Usage and Corrupted Memory(模拟C++程序内存使用崩溃问题)
    【转】Native Thread for Win32 C- Creating Processes(通俗易懂,非常好)
    【转】Native Thread for Win32 B-Threads Synchronization(通俗易懂,非常好)
    【转】Native Thread for Win32 A- Create Thread(通俗易懂,非常好)
    【转】关于OnPaint的工作机制
    Window发声函数Beep、MessageBeep
    Sqlite
    VC++ Splash Window封装类CSplash
    通过代码注册COM、DLL组件
  • 原文地址:https://www.cnblogs.com/huangying2124/p/12105378.html
Copyright © 2011-2022 走看看