上一篇已经安装Elasticsearch的两个节点 和 Kibana现在进行简单的操作
简单理解对应为关系型数据库的 数据库 表 一行记录
如果在postMan中操作需要根据上图的方式来进行操作
分片shard是es分布式系统的高可用方案 es会将一份数据进行分片自己理解为分解数据房租不同的机器上(默认为5份可以配置) 备份shard默认为1也就是每个分片都有一个备份,如果其中的一个分片宕机的话将由备份进行其他的请求操作实现高可用 , 相同的分片不能和相对于的备份存储在一台机器当中。
PUT /people 创建一个 人 的索引
POST /people/man/ 为索引添加数据 类型会自动创建
{
"name":"redis",
"school":"qinghua",
"introduce":"我是我是我jianqiao",
"age":28,
"birthday":"1996-06-22",
"score":479
}
现在修改数据 有两个rabbitmq修改为scala
POST /people/man/AWs_LjUOYHh6lG16ttAd/_update
{
"doc": {
"name":"scala"
}
}
kibana还是挺方便的可以自动补全
文档删除
删除索引可以在head中操作也可以脚本
-----------------------------查询是es的比较强的一个点-------------------------------
GET _search
{
"query": {
"match_all": {}
}
} 查询所有
-----------------------------
GET _search
{
"query":{
"match_all":{
}
},
"from":1,
"size":3
} 添加分页 from从第几个开始size几个
--------------------------
GET _search
{
"query":{
"match_all":{
}
},
"sort":[
{
"age":{
"order":"desc"
}
}
],
"_source":[
"age"
]
} 根据年龄排序 _source显示相关的字段即可 查看更方便
-------------------------
GET _search
{
"query":{
"match":{
"name":"elasticSearch入门 "
}
}
} es会将elasticSearch入门 进行拆分为elasticSearch和入门 进行匹配只要匹配其中一个都会进行返回
---------------------
GET _search
{
"query":{
"match_phrase":{
"name":"rabbitmq"
}
}
} 这个是完整匹配必须一模一样的才进行返回如 rabbitmq rabbitmq A 但是rabbitAmq不行
-------------------------------------------------
GET _search
{
"query":{
"terms":{
"name":[
"php",
"ajax"
]
}
}
} 查询名字是php 和ajax的doc 完全匹配
GET _search
{
"query":{
"term":{
"score":"479"
}
}
}一个terms和term term会将作为一个完整的查询匹配不会进行分词匹配
------------------------------------------------------
GET _search
{
"range":{
"score":{
"gte":400,
"lte":500
}
}
}
}
范围查询400-500分数的doc 可以比较时间now表示当前时间
-----------------------------------------------------
GET _search
{
"size":0,
"aggs":{
"group_haha":{
"terms":{
"field":"age"
}
}
}
} 聚合查询查询相同年级的人数有多少个 group_haha随便定义都可以
GET _search
{
"size":0,
"aggs":{
"group_haha":{
"terms":{
"field":"age"
}
},
"group_hehe":{
"terms":{
"field":"score"
}
}
}
}可以进行多个聚合同时返回
-------------------------
GET _search
{
"size":0,
"aggs":{
"group_stats":{
"stats":{
"field":"score"
}
}
}
} 可以进行计算返回最大最小平均总和也可以直接查询最小 将关键字stats、改为min或max
GET /tvs/sales/_search
{
"size":0,
"query":{
"term":{
"brand":{
"value":"小米" 先进行筛选
}
}
},
"aggs":{
"group_by_color":{
"terms":{
"field":"color" 对筛选的数据进行聚合
}
}
}
}
按每种颜色的平均销售额降序排序
GET /tvs/sales/_search
{
"size":0,
"aggs":{
"group_by_color":{
"terms":{
"field":"color",
"order":{
"avg_price":"asc"
}
},
"aggs":{
"avg_price":{
"avg":{
"field":"price" //计算出每种颜色的平均价然后进行排序
}
}
}
}
}
}
--------------------------
GET _search
{
"query":{
"multi_match":{
"query":"java",
"fields":[
"introduce",
"name"
]
}
}
} multi_match名称和介绍包含java就符合条件
后加
GET /forum/article/_search
{
"query":{
"multi_match":{
"query":"java solution", //搜索这两个关键词
"type":"best_fields",
"fields":[
"title^2",
"content"
], //title^2 boost为2 匹配title的权重会更高一点
"tie_breaker":0.3, //深入6中有详解
"minimum_should_match":"50%"//至少匹配一个
}
}
}
------------------------------------------------------
GET _search
{
"query":{
"query_string":{
"fields":[
"introduce"
],
"query":"java and jianqiao"
}
}
}
GET _search
{
"query":{
"query_string":{
"query":"(java and jianqiao) OR scala"
}
}
}
语法查询感觉这个比较强大可以使用关键字 and 和or fields可以去除可以多个,去除之后查询整条doc
解释: query_string直接可以搜索所有的field,任意一个field包含指定的关键字就可以搜索出来。我们在进行中搜索的时候,难道是对document中的每一个field都进行一次搜索吗?不是的
es中的_all元数据,在建立索引的时候,我们插入一条document,它里面包含了多个field,此时,es会自动将多个field的值,全部用字符串的方式串联起来,变成一个长的字符串,作为_all field的值,同时建立索引
后面如果在搜索的时候,没有对某个field指定搜索,就默认搜索_all field,其中是包含了所有field的值的
举个例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guamgzhou"
}
"jack 26 jack@sina.com guangzhou",作为这一条document的_all field的值,同时进行分词后建立对应的倒排索引
-----------------------------
GET _search
{
"query":{
"bool":{
"filter":{
"term":{
"age":"19"
}
}
}
}
}
过滤查询只查看年龄是19岁的doc term 和terms都可以 bool多个条件组合的使用
单独使用filter
{
"query":{
"constant_score":{
"filter":{
"range":{
"age":{
"gte":10,
"lte":30
}
}
},
"boost":1.2
}
}
}
--------------------------------------
前缀查询
{
"query":{
"prefix":{
"name":"sc"
}
}
}
--------------------------------------------------------
标识符查询针对多个id
{
"query":{
"ids":{
"values":[
"111",
"2",
"3"
]
}
}
}
--------------------------------------------
使用编辑距离的模糊查询,计算量较大,但是对用户拼写错的场景比较有用
{
"query":{
"fuzzy":{
"name":"abax" //查询出ajax
}
}
}
-------------------------------------------
支持*和?等通配符 ?:任意字符 *:0个或任意多个字符
{
"query":{
"wildcard":{
"name":"aj*x"
}
}
}
-------------------------------------------
GET _search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"php"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
} bool should应当满足条件满足其中一个就可以 或 || 可以满足条件也可以不满足
-------------------------------------------------------
GET _search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"php"
}
},
{
"match":{
"age":"18"
}
}
]
}
}
} 两个条件都要满足 与的关系
-----------------------------------------------------
GET _search
{
"query":{
"bool":{
"must_not":[
{
"term":{
"name":"php"
}
}
]
}
}
} 不显示不看名称是php的doc
使用bool组合查询
接受以下参数:
must:文档必须匹配设定条件才能被包含进来
must_not:文档必须不匹配设定条件才能被包含进来
should:如果满足语句中的任意语句,将增加_source,否则,无任何影响。主要用于修正每个文档的相关性得分
filter:必须匹配,但以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档
must:必须包含的条件,must not:不包含 ,should:包含的话会更匹配
------------------------批量操作------------------------
GET /_mget
{
"docs":[
{
"_index":"people",
"_type":"man",
"_id":"AWs_K3KEYHh6lG16ttAX"
},
{
"_index":"people",
"_type":"man",
"_id":"AWs_LJiZYHh6lG16ttAZ"
}
]
} 一次查询多条doc
GET /people/_mget
{
"docs":[
{
"_type":"man",
"_id":"AWs_K3KEYHh6lG16ttAX"
},
{
"_type":"wuman",
"_id":"AWs_LJiZYHh6lG16ttAZ"
}
]
} 一次查询多条doc 可以指定不同的type
GET /people/man/_mget
{
"ids":["AWs_LJiZYHh6lG16ttAZ"]
}
如果都在同一个index和type中指定ids查询
在查询多条记录的时候使用mget可以提升es的销量
-------------------------------------------------------------------
举例,比如你现在要创建一个文档,放bulk里面,看起来会是这样子的:
{"index": {"_index": "test_index",:"_type", "test_type", "_id": "1"}}
{"test_field1": "test1", "test_field2": "test2"}
有哪些类型的操作可以执行呢?
(1)delete:删除一个文档,只要1个json串就可以了
(2)create:PUT /index/type/id/_create,强制创建
(3)index:普通的put操作,可以是创建文档,也可以是全量替换文档
(4)update:执行的partial update操作
POST /_bulk
{"delete":{"_index":"people","_type":"man","_id":"AWs_LV1RYHh6lG16ttAb"}} //删除doc
{"create":{"_index":"people","_type":"man","_id":"111"}} //创建doc
{ "name":"Elasticsearch","school":"anhui","introduce":"我是我是我Elasticsearch","age":20,"birthday":"1996-06-22","score":434} //编写数据
{"update":{"_index":"people","_type":"wuman","_id":"AWtFEmkP1ihNSp8xGbqK","_retry_on_conflict":"3"}} //修改doc
{"doc":{"introduce":"大家好dajiahao大家好大家好大家好我是NODEJS"}} //编写修改的数据
bulk api对json的语法,有严格的要求,每个json串不能换行,只能放一行,同时一个json串和一个json串之间,必须有一个换行/与mget类似 路径上添加了index和type的话 操作语法中就可以不加
bulk操作中,任意一个操作失败,是不会影响其他的操作的,但是在返回结果里,会告诉你异常日志
2、bulk size最佳大小
bulk request会加载到内存里,如果太大的话,性能反而会下降,因此需要反复尝试一个最佳的bulk size。一般从1000~5000条数据开始,尝试逐渐增加。另外,如果看大小的话,最好是在5~15MB之间。
GET /test_index/test_type/_validate/query?explain
{
"query":{
"math":{
"test_field":"test"
}
}
}
检测语句是否合法
{
"valid": false,
"error": "org.elasticsearch.common.ParsingException: no [query] registered for [math]"
}
版本为5.2.0最新版本已经为7.X可能有差异,都是自学文章欢迎错误指正