Elastic Stack:es Mapping映射入门

Posted 秋风飒飒吹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elastic Stack:es Mapping映射入门相关的知识,希望对你有一定的参考价值。

一.概念

概念:自动或手动为index中的_doc建立的一种数据结构和相关配置,简称为mapping映射。

动态映射:dynamic mapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等设置。

我们当然也可以手动在创建数据之前,先创建index,以及对应的mapping

语法:

GET /INDEX/_mapping

 GET /book/_mapping查询结果:

{
  "book" : {
    "mappings" : {
      "properties" : {
        "description" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "pic" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "price" : {
          "type" : "float"
        },
        "studymodel" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "timestamp" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

搜索:

GET /website/_search?q=2019        0条结果             
GET /website/_search?q=2019-01-01           1条结果
GET /website/_search?q=post_date:2019-01-01     1条结果
GET /website/_search?q=post_date:2019          0 条结果

搜索结果为什么不一致,因为es自动建立mapping的时候,设置了不同的field不同的data type。不同的data type的分词、搜索等行为是不一样的。所以出现了_all field和post_date field的搜索表现完全不一样。

二.精确匹配与全文检索的对比分析

exact value 精确匹配:2019-01-01,exact value,搜索的时候,必须输入2019-01-01,才能搜索出来,如果你输入一个01,是搜索不出来的

full text 全文检索:

  2019-01-01,2019 01 01,搜索2019,或者01,都可以搜索出来

  china,搜索cn,也可以将china搜索出来

  likes,搜索like,也可以将likes搜索出来

  Tom,搜索tom,也可以将Tom搜索出来

  like,搜索love,同义词,也可以将like搜索出来

就不是说单纯的只是匹配完整的一个值,而是可以对值进行拆分词语后(分词)进行匹配,也可以通过缩写、时态、大小写、同义词等进行匹配。深入 NPL,自然语义处理。

三.分词器 analyzer

作用:切分词语,normalization(提升recall召回率),给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换)。

测试分词器:

GET /_analyze
{
  "analyzer": "standard",
  "text": "Text to analyze 80"
}

 分词结果:

 

 

token:实际存储的tern关键字

position:在此词条在原文本中的位置

start_offset/end_offset:字符在原始字符串中的位置

四.手动创建映射 

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

 Text文本类型:

1)analyzer :通过analyzer属性指定分词器。

2)index :index属性指定是否索引,默认为true,但是有一些内容不需要索引。

3)store :是否在source之外存储

 keyword关键字字段:

   目前已经取代了"index": false。上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。

  date日期类型:

日期类型不用设置分词器。

通常日期类型的字段用于排序。

通过format设置日期格式

        "timestamp": {
          "type":   "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
        }

 五.修改映射

只能创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping。

PUT /book/_mapping/
{
  "properties" : {
    "new_field" : {
      "type" :    "text",
     "index":    "false"
    }
  }
}

通过删除索引来删除映射。

以上是关于Elastic Stack:es Mapping映射入门的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Search中mapping的问题

Elastic Stack:es JavaApi搜索入门

Elastic Stack:es 索引index入门

Elastic Stack:es 搜索入门

Elastic stack技术栈学习— springboot集成ES API详解

Elastic stack--ES/kibana/filebeat/metricbeat