欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elasticsearch之mapping 详解

程序员文章站 2022-07-05 14:00:27
...

1.数据准备

    首先插入几条数据,让es自动为我们建立一个索引

PUT /website/article/1
{
  "post_date": "2017-01-01",
  "title": "my first article",
  "content": "this is my first article in this website",
  "author_id": 11400
}

PUT /website/article/2
{
  "post_date": "2017-01-02",
  "title": "my second article",
  "content": "this is my second article in this website",
  "author_id": 11400
}

PUT /website/article/3
{
  "post_date": "2017-01-03",
  "title": "my third article",
  "content": "this is my third article in this website",
  "author_id": 11400
}

    尝试各个搜索

GET /website/article/_search?q=2017  //查出3条结果             
GET /website/article/_search?q=2017-01-01 //也查出3条结果
GET /website/article/_search?q=post_date:2017-01-01  //查出1条结果
GET /website/article/_search?q=post_date:2017  //查出1条结果

    引出一个问题:为什么搜索结果会不一致

    mapping,就是index的type的元数据,每个type都有一个自己的mapping,决定了数据类型,建立倒排索引的行为,还有进行搜索的行为

 

2.对mapping的透彻理解

    • 往es里面直接插入数据,es会自动建立索引,同时建立type以及对应的mapping

    • mapping中就自动定义了每个field的数据类型

    • 不同的数据类型(比如说text和date),可能有的是exact value,有的是full text

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

    • 同时呢,exact value和full text类型的field就决定了,在一个搜索过来的时候,对exact value field或者是full text field进行搜索的行为也是不一样的,会跟建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索

    • 可以用es的dynamic mapping,让其自动建立mapping,包括自动设置数据类型;也可以提前手动创建index和type的mapping,自己对各个field进行设置,包括数据类型,包括索引行为,包括分词器,等等

 

3.mapping的核心数据类型

    String、byte、short、intege、long、float、double、boolean、date

dynamic mapping
true or false –> boolean 
123 –> long 
123.45 –> double 
2017-01-01 –> date 
“hello world” –> string/text

 

4.查看mapping

    GET /website/_mapping/

{
  "website": {
    "mappings": {
      "article": {
        "properties": {
          "author_id": {
            "type": "long"
          },
          "content": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "post_date": {
            "type": "date"
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}