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
}
相关推荐
出发行进41 分钟前
Hadoop其一,介绍本地模式,伪分布模式和全分布搭建
大数据·运维·hadoop·分布式
xyz20111 小时前
Hadoop中几种列式存储的区别和联系
大数据·hadoop·分布式
Rverdoser1 小时前
【Spark】Spark Join类型及Join实现方式
大数据·分布式·spark
Elastic 中国社区官方博客1 小时前
Elastic 8.17:Elasticsearch logsdb 索引模式、Elastic Rerank 等
大数据·数据库·人工智能·sql·elasticsearch·搜索引擎·全文检索
yunfei_run1 小时前
elasticsearch集群升级登录认证
java·大数据·后端·spring·elasticsearch
GIS甲鱼哥1 小时前
GeoWave实现简单的时空范围查询(HBase数据库)
java·大数据·数据库·hbase
阿东在路上2 小时前
Flink keyBy算子的分区规则
大数据·flink
说私域2 小时前
AI 智能名片 S2B2C 商城小程序在社群团购运营中的作用与价值
大数据·人工智能·小程序
说私域4 小时前
2+1 链动 S2B2C 商城小程序在互联网社群中的创新应用与价值剖析
大数据·小程序