引擎网站,营销策略包括哪些方面,wordpress登录用户访问,网站空间ftp连接失败ES批量操作
1.批量获取文档数据
这里多个文档是指#xff0c;批量操作多个文档#xff0c;搜索查询文档将在之后的章节讲解
批量获取文档数据是通过_mget的API来实现的
(1)在URL中不指定index和type
请求方式#xff1a;GET 请求地址#xff1a;_mget 功能说明 #…ES批量操作
1.批量获取文档数据
这里多个文档是指批量操作多个文档搜索查询文档将在之后的章节讲解
批量获取文档数据是通过_mget的API来实现的
(1)在URL中不指定index和type
请求方式GET 请求地址_mget 功能说明 可以通过ID批量获取不同index和type的数据 请求参数 docs : 文档数组参数 _index : 指定index _type : 指定type _id : 指定id _source : 指定要查询的字段
GET _mget
{
docs: [
{
_index: es_db,
_type: _doc,
_id: 1
},
{
_index: es_db,
_type: _doc,
_id: 2
}
]
}(2)在URL中指定index
请求方式GET 请求地址/{{indexName}}/_mget 功能说明 可以通过ID批量获取不同index和type的数据 请求参数 docs : 文档数组参数 _index : 指定index _type : 指定type _id : 指定id _source : 指定要查询的字段
GET /es_db/_mget
{
docs: [
{
_type:_doc,
_id: 3
},
{
_type:_doc,
_id: 4
}
]
}(3)在URL中指定index和type
请求方式GET 请求地址/{{indexName}}/{{typeName}}/_mget 功能说明 可以通过ID批量获取不同index和type的数据 请求参数 docs : 文档数组参数 _index : 指定index _type : 指定type _id : 指定id _source : 指定要查询的字段
GET /es_db/_doc/_mget
{
docs: [
{
_id: 1
},
{
_id: 2
}
]
}2.批量操作文档数据
批量对文档进行写操作是通过_bulk的API来实现的 请求方式POST 请求地址_bulk 请求参数通过_bulk操作文档一般至少有两行参数(或偶数行参数) 第一行参数为指定操作的类型及操作的对象(index,type和id) 第二行参数才是操作的数据 参数类似于
{actionName:{_index:indexName, _type:typeName,_id:id}}
{field1:value1, field2:value2}actionName表示操作类型主要有create,index,delete和update
(1)批量创建文档create
POST _bulk
{create:{_index:article, _type:_doc, _id:3}}
{id:3,title:zq老师1,content:zq老师666,tags:[java, 面向对象],create_time:1554015482530}
{create:{_index:article, _type:_doc, _id:4}}
{id:4,title:zq老师2,content:zq老师NB,tags:[java, 面向对象],create_time:1554015482530}(2)普通创建或全量替换index
POST _bulk
{index:{_index:article, _type:_doc, _id:3}}
{id:3,title:ES李明老师(一),content:ES学习李明老师666,tags:[java, 面向对象],create_time:1554015482530}
{index:{_index:article, _type:_doc, _id:4}}
{id:4,title:ES刘丽老师(二),content:ES学习刘丽老师NB,tags:[java, 面向对象],create_time:1554015482530}如果原文档不存在则是创建 如果原文档存在则是替换(全量修改原文档)
(3)批量删除delete
POST _bulk
{delete:{_index:article, _type:_doc, _id:3}}
{delete:{_index:article, _type:_doc, _id:4}}(4)批量修改update
POST _bulk
{update:{_index:article, _type:_doc, _id:3}}
{doc:{title:ES大法必修内功}}
{update:{_index:article, _type:_doc, _id:4}}
{doc:{create_time:1554018421008}}DSL语言高级查询
DSL: Domain Specific Language 领域专用语言。
DSL由叶子查询子句和复合查询子句两种子句组成。
2.无查询条件
无查询条件是查询所有默认是查询所有的或者使用match_all表示所有
GET /es_db/_doc/_search
{
query:{
match_all:{}
}3.有查询条件
3.1 叶子条件查询(单字段查询条件)
3.1.1 模糊匹配
模糊匹配主要是针对文本类型的字段文本类型的字段会对内容进行分词对查询时也会对搜索条件进行分词然后通过倒排索引查找到匹配的数据模糊匹配主要通过match等参数来实现 match : 通过match关键词模糊匹配条件内容 prefix : 前缀匹配 regexp : 通过正则表达式来匹配数据
match的复杂用法 match条件还支持以下参数 query : 指定匹配的值 operator : 匹配条件类型 and : 条件分词后都要匹配 or : 条件分词后有一个匹配即可(默认) minmum_should_match : 指定最小匹配的数量
3.1.2 精确匹配
term : 单个条件相等 terms : 单个字段属于某个值数组内的值 range : 字段属于某个范围内的值 exists : 某个字段的值是否存在 ids : 通过ID批量查询
3.2 组合条件查询(多条件查询)
组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询条件 bool : 各条件之间有and,or或not的关系 must : 各个条件都必须满足即各条件是and的关系 should : 各个条件有一个满足即可即各条件是or的关系 must_not : 不满足所有条件即各条件是not的关系 filter : 不计算相关度评分它不计算_score即相关度评分效率更高 constant_score : 不计算相关度评分 must/filter/shoud/must_not 等的子条件是通过 term/terms/range/ids/exists/match 等叶子条件为参数的 注以上参数当只有一个搜索条件时must等对应的是一个对象当是多个条件时对应的是一个数组
3.3 连接查询(多文档合并查询)
父子文档查询parent/child 嵌套文档查询: nested
3.4 DSL查询语言中存在两种查询DSLquery DSL和过滤DSLfilter DSL
它们两个的区别如下图
query DSL
在查询上下文中查询会回答这个问题——“这个文档匹不匹配这个查询它的相关度高么”
如何验证匹配很好理解如何计算相关度呢ES中索引的数据都会存储一个_score分值分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的因此也需要一定的时间。
filter DSL
在过滤器上下文中查询会回答这个问题——“这个文档匹不匹配”
答案很简单是或者不是。它不会去计算任何分值也不会关心返回的排序问题因此效率会高一点。
过滤上下文 是在使用filter参数时候的执行环境比如在bool查询中使用must_not或者filter
另外经常使用过滤器ES会自动的缓存过滤器的内容这对于查询来说会提高很多性能。
一些过滤的情况
3.5 Query方式查询:案例
根据名称精确查询姓名 term, term查询不会对字段进行分词查询会采用精确匹配 注意: 采用term精确查询, 查询字段映射类型属于为keyword. POST /es_db/_doc/_search
{
query: {
term: {
name: admin
}
}
}-- SQL:
select * from student where name admin根据备注信息模糊查询 match, match会根据该字段的分词器进行分词查询 举例:
POST /es_db/_doc/_search
{
from: 0,
size: 2,
query: {
match: {
address: 广州
}
}
}SQL: select * from user where address like %广州% limit 0, 2多字段模糊匹配查询与精准查询 multi_match
POST /es_db/_doc/_search
{
query:{
multi_match:{
query:张三,
fields:[address,name]
}
}
}SQL: select * from student where name like %张三% or address like %张三% 未指定字段条件查询 query_string , 含 AND 与 OR 条件
POST /es_db/_doc/_search
{
query:{
query_string:{
query:广州 OR 长沙
}
}
}指定字段条件查询 query_string , 含 AND 与 OR 条件
POST /es_db/_doc/_search
{
query:{
query_string:{
query:admin OR 长沙,
fields:[name,address]
}
}
}范围查询 注json请求字符串中部分字段的含义 range范围关键字 gte 大于等于 lte 小于等于 gt 大于 lt 小于 now 当前时间
POST /es_db/_doc/_search
{
query : {
range : {
age : {
gte:25,
lte:28
}
}
}
}SQL: select * from user where age between 25 and 28分页、输出字段、排序综合查询
POST /es_db/_doc/_search
{
query : {
range : {
age : {
gte:25,
lte:28
}
}
},
from: 0,
size: 2,
_source: [name, age, book],
sort: {age:desc}
}3.6 Filter过滤器方式查询它的查询不会计算相关性分值也不会对结果进行排序, 因此效率会高一点查询的结果可以被缓存。
Filter Context 对数据进行过滤
POST /es_db/_doc/_search
{
query : {
bool : {
filter : {
term:{
age:25
}
}
}
}
}总结:
match
match模糊匹配需要指定字段名但是输入会进行分词比如hello world会进行拆分为hello和world然后匹配如果字段中包含hello或者world或者都包含的结果都会被查询出来也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。
term
term: 这种查询和match在有些时候是等价的比如我们查询单个的词hello那么会和match查询结果一样但是如果查询hello world结果就相差很大因为这个输入不会进行分词就是说查询的时候是查询字段分词结果中是否有hello world的字样而不是查询字段中包含hello world的字样。当保存数据hello world时elasticsearch会对字段内容进行分词“hello world会被分成hello和world不存在hello world”因此这里的查询结果会为空。这也是term查询和match的区别。
match_phase
match_phase会对输入做分词但是需要结果中也包含所有的分词而且顺序要求一样。以hello world为例要求结果中必须包含hello和world而且还要求他们是连着的顺序也是固定的hello that world不满足world hello也不满足条件。
query_string
query_string和match类似但是match需要指定字段名query_string是在所有字段中搜索范围更广泛。
三.文档映射
1.ES中映射可以分为动态映射和静态映射
动态映射 在关系数据库中需要事先创建数据库然后在该数据库下创建数据表并创建表字段、类型、长度、主键等最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射即关系型数据库的表、字段等在文档写入Elasticsearch时会根据文档字段自动识别类型这种机制称之为动态映射。 动态映射规则如下 静态映射 静态映射是在Elasticsearch中也可以事先定义好映射包含文档的各字段类型、分词器等这种方式称之为静态映射。
2 动态映射
2.1 删除原创建的索引 DELETE /es_db
2.2 创建索引 PUT /es_db
2.3 创建文档(ES根据数据类型, 会自动创建映射) PUT /es_db/_doc/1 { “name”: “Jack”, “sex”: 1, “age”: 25, “book”: “java入门至精通”, “address”: “广州小蛮腰” }
2.4 获取文档映射 GET /es_db/_mapping
3 静态映射
3.1 删除原创建的索引 DELETE /es_db
3.2 创建索引 PUT /es_db
3.3 设置文档映射 PUT /es_db { “mappings”:{ “properties”:{ “name”:{“type”:“keyword”,“index”:true,“store”:true}, “sex”:{“type”:“integer”,“index”:true,“store”:true}, “age”:{“type”:“integer”,“index”:true,“store”:true}, “book”:{“type”:“text”,“index”:true,“store”:true}, “address”:{“type”:“text”,“index”:true,“store”:true} } } }
3.4 根据静态映射创建文档 PUT /es_db/_doc/1 { “name”: “Jack”, “sex”: 1, “age”: 25, “book”: “elasticSearch入门至精通”, “address”: “广州车陂” }
3.5 获取文档映射 GET /es_db/_mapping
四.核心类型Core datatype
字符串stringstring类型包含 text 和 keyword。 text该类型被用来索引长文本在创建索引前会将这些文本进行分词转化为词的组合建立索引允许es来检索这些词text类型不能用来排序和聚合。 keyword该类型不能分词可以被用来检索过滤、排序和聚合keyword类型不可用text进行分词模糊检索。 数值型long、integer、short、byte、double、float 日期型date 布尔型boolean
五.keyword 与 text 映射类型的区别
将 book 字段设置为 keyword 映射 只能精准查询, 不能分词查询能聚合、排序
POST /es_db/_doc/_search
{
query: {
term: {
book: elasticSearch入门至精通
}
}
}将 book 字段设置为 text 映射能模糊查询, 能分词查询不能聚合、排序
POST /es_db/_doc/_search
{
query: {
match: {
book: elasticSearch入门至精通
}
}
}六.创建静态映射时指定text类型的ik分词器
1.设置ik分词器的文档映射
先删除之前的es_db 再创建新的es_db 定义ik_smart的映射
PUT /es_db
{
mappings:{
properties:{
name:{type:keyword,index:true,store:true},
sex:{type:integer,index:true,store:true},
age:{type:integer,index:true,store:true},
book:{type:text,index:true,store:true,analyzer:ik_smart,search_analyzer:ik_smart},
address:{type:text,index:true,store:true}
}
}
}2.分词查询
POST /es_db/_doc/_search
{
query: {
match: {address: 广}
}
} POST /es_db/_doc/_search
{
query: {
match: {address: 广州}
}
} 七.对已存在的mapping映射进行修改
具体方法 1如果要推倒现有的映射, 你得重新建立一个静态索引 2然后把之前索引里的数据导入到新的索引里 3删除原创建的索引 4为新索引起个别名, 为原索引名
POST _reindex
{
source: {
index: db_index
},
dest: {
index: db_index_2
}
}DELETE /db_indexPUT /db_index_2/_alias/db_index注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机
八.Elasticsearch乐观并发控制
在数据库领域中有两种方法来确保并发更新不会丢失数据
1、悲观并发控制
这种方法被关系型数据库广泛使用它假定有变更冲突可能发生因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住确保只有放置锁的线程能够对这行数据进行修改。
2、乐观并发控制
Elasticsearch 中使用的这种方法假定冲突是不可能发生的并且不会阻塞正在尝试的操作。 然而如果源数据在读写当中被修改更新将会失败。应用程序接下来将决定该如何解决冲突。 例如可以重试更新、使用新的数据、或者将相关情况报告给用户。
3、再以创建一个文档为例 ES老版本
PUT /db_index/_doc/1 { “name”: “Jack”, “sex”: 1, “age”: 25, “book”: “Spring Boot 入门到精通”, “remark”: “hello world” }
4、实现_version乐观锁更新文档
PUT /db_index/_doc/1?version1 { “name”: “Jack”, “sex”: 1, “age”: 25, “book”: “Spring Boot 入门到精通”, “remark”: “hello world” }
5、ES新版本(7.x)不使用version进行并发版本控制 if_seq_no版本值if_primary_term文档位置
_seq_no文档版本号作用同_version _primary_term文档所在位置
POST /es_sc/_searchDELETE /es_scPOST /es_sc/_doc/1
{
id: 1,
name: ES学习,
desc: ES学习desc,
create_date: 2021-02-24
}POST /es_sc/_update/1
{
doc: {
name: ES教育666
}
}POST /es_sc/_update/1/?if_seq_no1if_primary_term1
{
doc: {
name: ES学习1
}
}POST /es_sc/_update/1/?if_seq_no1if_primary_term1
{
doc: {
name: ES学习2
}
}九.Java API操作ES