一、创建索引 自动生成索引字段数据类型即自动映射
创建之前,先删除索引防止重复创建
删除索引:
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
}