elasticsearch教程
注意:
1、elasticsearch的rest默认端口为9200,客户端的默认端口为9300,也就是,java编程连接的端口为9300
命令模式:
curl -<REST Verb> <Node>:<Port>/<Index>/<Type><ID>
返回字段说明:
- took —— Elasticsearch执行这个搜索的耗时,以毫秒为单位
- timed_out —— 指明这个搜索是否超时
- _shards —— 指出多少个分片被搜索了,同时也指出了成功/失败的被搜索的shards的数量
- hits —— 搜索结果
- hits.total —— 能够匹配我们查询标准的文档的总数目
- hits.hits —— 真正的搜索结果数据(默认只显示前10个文档)
- _score和max_score —— 现在先忽略这些字段
1、检查集群健康
curl 'localhost:9200/_cat/health?v'
2、获得节集群中的节点列表
curl 'localhost:9200/_cat/nodes?v'
3、列出所有的索引
curl 'localhost:9200/_cat/indices?v'
4、创建一个索引customer
curl -XPUT 'localhost:9200/customer?pretty'
说明:索引index相当于一个库,pretty附加到调用的尾部,使其以美观的形式打印出JSON响应(如果有的话),不添加pretty也会打印结果,只是不美观
5、在customer索引下创建一个文档external(添加一个记录)
curl -XPUT '192.168.60.128:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'
说明:文档type相当于一个表
curl -XPOST 'localhost:9200/customer/external?pretty' -d '
{
"name": "Jane Doe"
}'
注意,在上面的情形中,由于我们没有指定一个ID,我们使用的是POST而不是PUT
6、数据查询
查询一个id=1的数据
curl -XGET '192.168.60.128:9200/customer/external/1?pretty'
查询external下所有的数据
curl -XGET '192.168.60.128:9200/customer/external/_search?pretty'
查询customer下所有的数据
curl -XGET '192.168.60.128:9200/customer/_search?pretty'
查询所有数据
curl -XGET '192.168.60.128:9200/_search?pretty'
7、删除一个索引
curl -XDELETE '192.168.60.128
:9200/customer?pretty'
8、修改文档(数据)
curl -XPUT '192.168.60.128:9200/customer/external/1?pretty' -d '
{
"name": "Tom"
}'
curl -XPOST '192.168.60.128
:9200/customer/external/1/_update?pretty' -d '
{
"doc": { "name": "Jane Doe", "age": 20 }
}'
curl -XPOST '192.168.60.128
:9200/customer/external/1/_update?pretty' -d '
{
"script" : "ctx._source.age += 5"
}'
9、删除文档(数据)
curl -XDELETE '192.168.60.128
:9200/customer/external/1?pretty'
删除符合某个查询条件的多个文档
curl -XDELETE 'localhost:9200/customer/external/_query?pretty' -d '
{
"query": { "match": { "name": "John" } }
}'
10、批处理
添加两个文档(ID 1 - John Doe and ID 2 - Jane Doe)
curl -XPOST '192.168.60.128
:9200/customer/external/_bulk?pretty' -d '
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
更新第一个文档(ID为1),然后删除第二个文档(ID为2):
curl -XPOST '192.168.60.128
:9200/customer/external/_bulk?pretty' -d '
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
11、导入json文件(导入数据)
curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
accounts.json为一个存储着json数据的文件
12、请求体条件搜索
curl '192.168.60.128
:9200/bank/_search?q=*&pretty'
使用请求体方法的等价搜索是:
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": { "match_all": {} }
}'
match(equal)条件查询,相当于select account_number,balance from bank.account where gender='M' order by balance desc limit 10,10
curl -XPOST '192.168.60.128
:9200/bank/account/_search?pretty' -d '
{
"_source": ["account_number", "balance"],
"query": { "match": {"gender":"M"} },
"sort": { "balance": { "order": "desc" } }
"from": 10,
"size": 10
}'
match_phrase(like)条件查询,相当于select * from bank.account where address like ‘%mill lane%’
注意:字符串匹配不分大小写
curl -XPOST '192.168.60.128
:9200/bank/account/_search?pretty' -d '
{
"query": { "match_phrase": { "address": "mill lane" } }
}'
must(and)条件查询,相当于select * from bank.account where address like "%mill%" and address like "%lane%"
返回包含“mill”和“lane”的所有的账户
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
should(or)条件查询,相当于select * from bank.account where address like "%mill%" or address like "%lane%"
返回地址中包含“mill”或者“lane”的所有的账户
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
must_not(not in)条件查询,相当于select * from bank.accout where id not in(select id from bank.account where address like "%mill%" or address like "lane")
返回地址中既不包含“mill”,同时也不包含“lane”的所有的账户信息
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}'
返回40岁以上并且不生活在ID(daho)的人的账户
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}'
过滤的查询,其返回值是越在20000到30000之间(闭区间)的账户
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}
聚合,group by
curl -XPUT 'http://192.168.60.128:9200/bank/_mapping/account?pretty=true
' -d '
{
"properties": {
"state": {
"type": "text",
"fielddata": true
}
}
}'
统计每个state有多少条记录
将size设置成0,这样就可以只看到聚合结果了,而不会显示命中的结果
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty=true
' -d '
{
"size":0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state"
}
}
}
}'
计算了每个州的账户的平均余额(还是按照账户数量倒序排序的前10个州)
curl -XPOST '192.168.60.128
:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state",
"order": {
"average_balance": "desc"
}
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}'
使用年龄段(20-29,30-39,40-49)分组,然后在用性别分组,然后为每一个年龄段的每一个性别计算平均账户余额
curl -XPUT "http://192.168.60.128:9200/bank/_mapping/account" -d'
{
"properties": {
"gender": {
"type": "text",
"fielddata": true
}
}
}'
curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}
curl -XPOST '192.168.60.128
:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
curl '192.168.60.128
:9200/_cat/indices?v'
13、IK中文分词器使用
curl -XPUT http://192.168.60.128:9200/ik
curl -XPOST http://192.168.60.128:9200/ik/fulltext/_mapping -d'{ "fulltext": { "_all": { "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "term_vector": "no", "store": "false" }, "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "include_in_all": "true", "boost": 8 } } }}'
curl -XPOST http://192.168.60.128:9200/ik/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}'
curl -XPOST http://192.168.60.128:9200/ik/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}'
curl -XPOST http://192.168.60.128:9200/ik/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'
curl -XPOST http://192.168.60.128:9200/ik/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'
curl -XPOST http://192.168.60.128:9200/ik/fulltext/_search -d'{ "query" : { "match" : { "content" : "中国" }}, "highlight" : { "pre_tags" : ["<tag1>", "<tag2>"], "post_tags" : ["</tag1>", "</tag2>"], "fields" : { "content" : {} } }}'