Elasticsearch:Mapping-映射

一、创建索引 自动生成索引字段数据类型即自动映射

创建之前,先删除索引防止重复创建
删除索引:

bash 复制代码
DELETE product_mapping

创建索引 product_mapping并且赋值

bash 复制代码
PUT /product_mapping/_doc/1
{
 "name": "xiaomi phone",
 "desc": "shouji zhong de zhandouji",
 "count": 123456,
 "price": 123.123,
 "date": "2020-05-20",
 "isdel": false,
 "tags": [
 "xingjiabi",
 "fashao",
 "buka"
 ]
}

执行结束:索引创建成功。

bash 复制代码
{
  "_index" : "product_mapping",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

查询索引

bash 复制代码
GET product_mapping/_search

执行结果:

bash 复制代码
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "product_mapping",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "xiaomi phone",
          "desc" : "shouji zhong de zhandouji",
          "count" : 123456,
          "price" : 123.123,
          "date" : "2020-05-20",
          "isdel" : false,
          "tags" : [
            "xingjiabi",
            "fashao",
            "buka"
          ]
        }
      }
    ]
  }
}

查询索引自动生成的映射

bash 复制代码
GET product_mapping/_mapping

结果如下:

bash 复制代码
{
  "product_mapping" : {
    "mappings" : {
      "properties" : {
        "count" : {
          "type" : "long"
        },
        "date" : {
          "type" : "date"
        },
        "desc" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "isdel" : {
          "type" : "boolean"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "price" : {
          "type" : "float"
        },
        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

总结:

根据put创建索引赋值的时候每个字段的数据,动态的生成了字段的属性,可以类比mysql的表结构的字段属性,这里重点介绍一下text类型,即文本类型,在创建索引的时候,如果是text类型的,那么会对这个字段进行索引,生成倒排索引进行存储,后续查询的时候,如果查询方式也支持对搜索的内容进行索引分词,那么就会把搜索条件分词后的词项和生成索引的时候索引的列的词项进行匹配。

bash 复制代码
"fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }

这个keyword,不会分词,如果text需要精准匹配,可以用该字段的keyword.

1."name": "xiaomi phone",在创建索引的时候,这个会被分词为xiaomi 和 phone两个词项,下面的查询方式

搜索内容无论是xiaomi 或者 phone 还是两个顺序颠倒,都能匹配到,因为会对搜索条件进行分词为xiaomi 或者 phone,匹配索引分词后的词根会匹配到。

bash 复制代码
GET product_mapping/_search
{
  "query": {
    "match": {
      "name": "phone xiaomi "
    }
  }
}

name.keyword 就是查询索引中name分词前为xiaomi 的内容,因为name分词前只有xiaomi phone,所以这样查询不到

bash 复制代码
GET product_mapping/_search
{
  "query": {
    "match": {
      "name.keyword": " xiaomi "
    }
  }
}

下面这样的方式可以匹配的到

bash 复制代码
GET product_mapping/_search
{
  "query": {
    "match": {
      "name.keyword": "xiaomi phone"
    }
  }
}

二、创建索引 手动映射数据类型

手动创建索引和mapping映射

bash 复制代码
PUT /product
{
 "mappings": {
 "properties": {
 "date": {
 "type": "text"
 },
 "desc": {
 "type": "text",
 "analyzer": "english"
 },
 "name": {
 "type": "text",
 "index": "false"
 },
 "price": {
 "type": "long"
 },
 "tags": {
 "type": "text",
 "index": "true"
 },
 "parts": {
 "type": "object"
 },
 "partlist": {
 "type": "nested"
 }
 }
 }
}

name的属性"index": "false"表示创建索引的时候不进行分词。

bash 复制代码
GET /product/_search
{
  "query": {
    "match": {
      "name": "xiaomi"
    }
  }
}

执行会报错

bash 复制代码
{
  "error" : {
    "root_cause" : [
      {
        "type" : "query_shard_exception",
        "reason" : "failed to create query: Cannot search on field [name] since it is not indexed.",
        "index_uuid" : "wEUFSz6VQmaC6Ko9oE3cxQ",
        "index" : "product"
      }
    ],
    "type" : "search_phase_execution_exception",
    "reason" : "all shards failed",
    "phase" : "query",
    "grouped" : true,
    "failed_shards" : [
      {
        "shard" : 0,
        "index" : "product",
        "node" : "QaQYrOAFRr2kwyt6IuJU9Q",
        "reason" : {
          "type" : "query_shard_exception",
          "reason" : "failed to create query: Cannot search on field [name] since it is not indexed.",
          "index_uuid" : "wEUFSz6VQmaC6Ko9oE3cxQ",
          "index" : "product",
          "caused_by" : {
            "type" : "illegal_argument_exception",
            "reason" : "Cannot search on field [name] since it is not indexed."
          }
        }
      }
    ]
  },
  "status" : 400
}
相关推荐
果冻人工智能12 分钟前
AI能否取代软件架构师?我将4个大语言模型进行了测试
大数据·人工智能·深度学习·语言模型·自然语言处理·ai员工
Acrel1361196551413 分钟前
Acrel-EIoT 能源物联网云平台在能耗监测系统中的创新设计
大数据·人工智能·能源·创业创新
大腾智能1 小时前
五一旅游潮涌:数字化如何驱动智慧旅游升级
大数据·人工智能·数字化·旅游数字化
斯普信专业组2 小时前
Elasticsearch内存管理与JVM优化:原理剖析与最佳实践
大数据·jvm·elasticsearch
Wnq100723 小时前
数据链共享:从印巴空战到工业控制的跨越性应用
大数据·人工智能·数据链共享
海金沙335 小时前
购物数据分析
大数据
Leo.yuan5 小时前
热力图是什么?三分钟学会热力图数据分析怎么做!
大数据·数据库·数据挖掘·数据分析·html
IvanCodes5 小时前
一、数据仓库基石:核心理论、分层艺术与 ETL/ELT 之辨
大数据·数据仓库·hive·etl
玩转数据库管理工具FOR DBLENS5 小时前
项目高压生存指南:科学重构身体与认知系统的抗压算法
大数据·数据库·职场和发展·项目管理
金融小师妹5 小时前
量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构
大数据·人工智能·算法