ElasticSearch基础使用CRUD、DSL以及文档映射

四.ElasticSearch基础

4.1.索引库CRUD

4.1.1增加索引库
PUT shopping
{
	"settings":{
		"number_of_shards":5,
		"number_of_replicas":1
	}
}
4.1.2查询索引库
GET _cat/indices?v

查看指定索引库

GET _cat/indices/aigou

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfNnHdbX-1581164132995)(images/1573717333201.png)]

4.1.3.删除索引库
DELETE 名字
4.1.4.修改索引库
删除再添加

4.2.文档的CRUD

4.2.1.文档概念
ES Mysql
_index(索引库) 数据库
_type(文档类型)
_document(文档对象) 一行数据
_id(文档ID) 主键ID
field(字段)

其他

_source (文档原始数据-就是保存在ES中的真实数据)
_all (所有字段的连接字符串)
metadata (文档元数据-出去文档真实数据意外的其他数据)
4.2.2.添加文档

语法

PUT 索引库/文档类型/文档id
{
	文档原始数据
}

案例:

PUT crm/user/11	
{
	"id":11,
	"username":"zs"
}

解释:添加id为11的用户 , 索引库为 crm,类型为 User

注意:如果不指定文档的id,ES会自动生成文档id

4.2.3.获取文档

a.获取指定文档

GET 索引库/类型/文档ID 

b.指定返回的列

GET /itsource/employee/123?_source=fullName,email
4.2.4.修改文档
a.整体修改
PUT {index}/{type}/{id}
{
	修改后的内容
}

ps: 全量修改的语法跟添加文档语法一样,如果文档已经存在就是添加,否则就是修改,

文档修改过程:1.标记删除旧文档,2.添加新文档

b.局部修改
POST itsource/employee/123/_update
{
    "doc":{
        "email" : "[email protected]", 
        "salary": 1000
    }
}

ps:文档修改过程: 1.检索旧文档 , 2.修改文档 ,3.标记删除旧文档 , 4.添加新文档

4.2.5.删除文档
DELETE {index}/{type}/{id}

五.文档的查询

5.1.常用查询

5.1.1.查询所有
GET _search
5.1.2.查询指定索引库
GET crm/_search
5.1.3.查询指定类型
GET crm/user/_search
5.1.4.查询指定文档
GET crm/user/11
5.1.5.分页查询
&size=2&from=2
  • size: 每页条数
  • form:从多少条数据开始查
5.1.6.字符串查询

条件查询+分页+排序

GET crm/user/_search?q=age:17&size=2&from=2&sort=id:desc&_source=id,username

字符串查询(query string)其实就是在url后面以字符串的方式拼接各种查询条件,这种方式不推荐,因为条件过多,拼接起来比较麻烦

5.1.7.批量查询

批量查询很重要,对相比单个查询来说,批量查询性能更高。

a.不同索引库查询
GET _mget
{
    "docs" : [
        {
            "_index" : "itsource",
            "_type" : "blog",
            "_id" : 2
        },
        {
            "_index" : "itsource",
            "_type" : "employee",
            "_id" : 1,
            "_source": "email,age"
        }
    ]
}
b.同索引库同类型 - 推荐
GET itsource/blog/_mget
{
	"ids" : [ "2", "1" ]
}

六.DSL查询与DSL过滤

6.1.基本概念

6.1.1.基本概念

DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同:DSL过滤查询文档的方式更像是对于我的条件"有"或者"没有"(等于 ;不等于),而DSL查询语句则像是"有多像"(模糊查询)。

6.1.2.查询与过滤的区别

DSL过滤和DSL查询在性能上的区别:

  • 过滤结果可以缓存并应用到后续请求。-> 精确过滤后的结果拿去模糊查询性能高
  • 查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
  • 过滤语句可有效地配合查询语句完成文档过滤。

总结:需要模糊查询的使用DSL查询 ,需要精确查询的使用DSL过滤,在开发中组合使用(组合查询) -> 关键字查询使用DSL查询,其他的都是用DSL过滤。

6.2.综合案例

6.2.1.语法介绍
GET crm/user/_search
{
    "query": {
       "bool": { 
              "must": [
                	{"match": {"description": "search" }}
               ],
               "filter": {
                   "term": {"tags": "lucene"}
               }
        }
    },
    "from": 20, 
    "size": 10,
    "_source": ["fullName", "age", "email"],
    "sort": [{"join_date": "desc"},{"age": "asc"}]
}

解释:

query : 查询

bool : 组合查询 , 包含了 DSL查询和DSL过滤

must : 必须匹配 :与(must) 或(should) 非(must_not)

match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配

filter: 过滤条件

term:词元查询,不会对查询条件分词

from,size :分页

_source :查询结果中需要哪些列

sort:排序

6.2.2综合案例

组合搜索bool可以组合多个查询条件为一个查询对象,名称(name)中有 “娃娃” 的商品 ,价格(minPrice)在 10000- 20000之间,品牌id为 14,按照销量(saleCount)倒排序,查询第 1 页,每页10 条 ,查询结果中只需要 :id,name,minPrice,brandId

GET aigou/product/_search 
{
	"query":{
		"bool": {
			"must": [{
				"match": {
					"name": "春季"
				}
			}],
			
			"filter": [
				{
                    "range":{	//范围查询
                        "minPrice":{
                            "gte":10000,
                            "lte":20000
                        }
                    }
				},
				{
					"term": {	//词元查询
						"brandId": 14
					}
				}
			]
		}
	},
	"from": 1,
	"size": 10,
	"_source": ["id", "name", "minPrice","brandId"],
	"sort": [{
		"saleCount": "desc"
	}]
}

ps:其他查询方式

  • term:单词/词元查询
  • match : 分词查询(模糊匹配)
  • multi_match :多字段匹配
  • range:范围查询
  • exists :存在
  • missing : 不存在
  • prefix:前缀匹配
  • wildcard:通配符匹配 ,使用*代表0~N个,使用?代表1个。

七.文档的映射

7.1.基本概念

7.1.1.什么是文档映射

​ ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型。

  • Mysql建表过程:创建数据库 -> 创建表(指定字段类型) -> crud数据
  • ES创建索引过程:创建索引库 -> 文档类型映射 -> crud文档
  • 映射与分词 : 为了方便字段的检索,我么会对某些存储在ES中的字段进行分词,但是有些字段类型可以分词,有些字段类型不可以分词,所以对于字段的类型需要我们自己去指定。
7.1.2.默认的字段类型

查看索引类型的映射配置:GET {indexName}/_mapping/{typeName}

a.基本字段类型
  • 字符串

    text(分词), keyword(不分词) ,StringField(不分词文本),TextFiled(要分词文本) ,text默认为全文文本,keyword默认为非全文文本

  • 数字(long,integer,short,double,float)

  • 日期date

  • 逻辑boolean

b.复杂字段类型
  • 对象类型:object
  • 数组类型:array
  • 地理位置:geo_point,geo_shape
c.默认映射

ES在没有配置Mapping的情况下新增文档,ES会尝试对字段类型进行猜测,并动态生成字段和类型的映射关系。

JSON type Field type
Boolean: true or false “boolean”
Whole number: 123 “long”
Floating point: 123.45 “double”
String, valid date:“2014-09-15” “date”
String: “foo bar” “string”
7.1.3.映射规则

字段映射的常用属性配置列表 - 即给某个字段执行类的时候可以指定以下属性

属性名 解释
type 字段的类型:基本数据类型,integer,long,date,boolean,keyword,text…
enable 是否启用:默认为true。 false:不能索引、不能搜索过滤。
boost 权重提升倍数:用于查询时加权计算最终的得分,比如标题中搜索到的内容比简介中搜索到的内容跟重要,那么可以提升
index 索引模式:analyzed (索引并分词,text默认模式), not_analyzed (索引不分词,keyword默认模式),no(不索引)
analyzer 索引分词器:索引创建时使用的分词器,如ik_smart,ik_max_word,standard
search_analyzer 搜索分词器:搜索该字段的值时,传入的查询内容的分词器。
fields 多字段索引:当对该字段需要使用多种索引模式时使用。如:城市搜索New York"city":
"city":{  
	"type": "text",   
	"analyzer": "ik_smart",   
	"fields": {      
		"raw": {         
			"type":  "keyword"       
		}   
	}
}

解释:相当于给 city取了一个别名 city.raw,city的类型为text , city.raw的类型为 keyword
搜索 city分词 ; 搜索city.raw 不分词那么以后搜索过滤和排序就可以使用city.raw字段名

7.2.添加映射

注意:如果索引库已经有数据了,就不能再添加映射了

7.2.1.创建新的索引库
put aigou
7.2.2.单类型创建映射
put aigou/goods/_mapping
{
	"goods": {
        "properties": {
            "id": {
                "type": "long"
            },
            "name": {
                "type": "text",
                "analyzer": "ik_smart",
                "search_analyzer": "ik_smart"
            }
        }
    }
}

解释:给aigou索引库中的是goods类型创建映射 ,id指定为long类型 , name指定为text类型(要分词),analyzer分词使用ik,查询分词器也使用ik

7.2.3.多类型创建映射
PUT aigou
{
  "mappings": {
    "user": {
      "properties": {
        "id": {
          "type": "integer"
        },
        "info": {
          "type": "text",
          "analyzer": "ik_smart",
          "search_analyzer": "ik_smart"
        }
      }
    },
    "dept": {
      "properties": {
        "id": {
          "type": "integer"
        },
        ....更多字段映射配置
      }
    }
  }
}

解释:同时给user和dept创建文档映射

7.3.数组/对象映射

基本类型字段映射非常简单,直接配置对应的类型即可,但是数组和对象如何指定类型呢?

7.3.1.对象映射
{
  "id" : 1,
  "girl" : {
      "name" : "王小花",
      "age"  : 22
  }
}

文档映射

{ 
  "properties": {
       "id": {"type": "long"},
       "girl": {
           "properties":{
           		"name": {"type": "keyword"},
           		"age": {"type": "integer"}
           }
        }
  }
}
7.3.2.数组映射
{
	"id" : 1,
	"hobby" : ["王小花","林志玲"]
}

文档映射

{ 
		"properties": {
            "id": {"type": "long"},
            "hobby": {"type": "keyword"}
     }
}

解释:数组的映射只需要映射一个元素即可,因为数组中的元素类型是一样的。

7.3.3.对象数组
{
	"id" : 1,
	"girl":[{"name":"林志玲","age":32},{"name":"赵丽颖","age":22}]
}

文档映射

"properties": {
        "id": {
            "type": "long"
        },
        "girl": {
            "properties": {
              "age": { "type": "long" },
              "name": { "type": "text" }
            }
        }
}

7.4.全局映射

索引库中多个类型(表)的字段是有相同的映射,如所有的ID都可以指定为integer类型,基于这种思想,我们可以做全局映射,让所有的文档都使用全局文档映射。全局映射可以通过动态模板和默认设置两种方式实现。

7.4.1.默认方式:default

索引下所有的类型映射配置会继承_default_的配置,如:

PUT {indexName}
{
 "mappings": {
    "_default_": { 
       "_all": {
        	"enabled": false
       }
  },
  "user": {}, 
  "dept": { 
     "_all": {
      	"enabled": true
     }
  }
 }

关闭默认的 _all ,dept自定义开启 all

7.4.2.动态模板

dynamic_templates

PUT _template/global_template  //创建名为global_template的模板
{
  "template":   "*",  //匹配所有索引库
  "settings": { "number_of_shards": 1 }, //匹配到的索引库只创建1个主分片
  "mappings": {
    "_default_": {
      "_all": { 
        "enabled": false //关闭所有类型的_all字段
      },
      "dynamic_templates": [
        {
          "string_as_text": { 
            "match_mapping_type": "string",//匹配类型string
            "match":   "*_text", //匹配字段名字以_text结尾
            "mapping": {
              "type": "text",//将类型为string的字段映射为text类型
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word",
              "fields": {
                "raw": {
                  "type":  "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        },
        {
          "string_as_keyword": { 
            "match_mapping_type": "string",//匹配类型string
            "mapping": {
              "type": "keyword"//将类型为string的字段映射为keyword类型
             }
          }
        }
      ]
    }
  }}

PS : 映射方式优先级 (低 -> 高):默认 -> 全局 -> 自定义

发布了47 篇原创文章 · 获赞 6 · 访问量 1577

猜你喜欢

转载自blog.csdn.net/yy971733014/article/details/104227732