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
}
相关推荐
jonyleek28 分钟前
「JVS更新日志」低代码、企业会议、智能BI、智能排产2.26更新说明
java·大数据·低代码·数据分析·软件需求
kngines1 小时前
【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.1单节点安装(Docker与手动部署)
大数据·elasticsearch·docker
小稻草打打打1 小时前
金融项目管理:合规性与风险管理的实战指南
大数据·金融
霍小毛4 小时前
Hive 与 TiDB 在大数据解析场景中的对比分析
大数据·hive·tidb
sanshizhang4 小时前
eclasticsearch文档搜索
java·elasticsearch
zhanghe68710 小时前
使用elasticdump导出/导入 -- ES数据
elasticsearch
知初~11 小时前
Spark内存并行计算框架
大数据·分布式·spark
2403_8751809512 小时前
AI数字人开发,引领科技新潮流
java·大数据·数据结构·人工智能·科技·前端框架
百事不可口y12 小时前
【产品小白】怎么量化用户体验呢
大数据·人工智能·产品运营·产品经理·用户运营·内容运营
十二零七12 小时前
掌握 ElasticSearch 精准查询:Term Query 与 Filter 详解
大数据·elasticsearch·搜索引擎