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
}
相关推荐
史嘉庆几秒前
Pandas 数据分析(二)【股票数据】
大数据·数据分析·pandas
唯余木叶下弦声1 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
重生之Java再爱我一次2 小时前
Hadoop集群搭建
大数据·hadoop·分布式
豪越大豪3 小时前
2024年智慧消防一体化安全管控年度回顾与2025年预测
大数据·科技·运维开发
互联网资讯4 小时前
详解共享WiFi小程序怎么弄!
大数据·运维·网络·人工智能·小程序·生活
小诺大人5 小时前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
AI2AGI5 小时前
天天AI-20250121:全面解读 AI 实践课程:动手学大模型(含PDF课件)
大数据·人工智能·百度·ai·文心一言
贾贾20236 小时前
配电自动化中的进线监控技术
大数据·运维·网络·自动化·能源·制造·信息与通信
Denodo7 小时前
10倍数据交付提升 | 通过逻辑数据仓库和数据编织高效管理和利用大数据
大数据·数据库·数据仓库·人工智能·数据挖掘·数据分析·数据编织