安装ik分词器。ik分词器的作者构建8.10.2的包,所以就先下载一个别的版本放在elasticsearch-8.10.2\plugins目录下,在pom.xml中修改版本号就可以了。
先准备数据
# 批量添加数据
PUT test_query
put test_query/_bulk
{"index": {"_index" : "test_query","_id":"1001"}}
{"id":"1001","name": "zhang san","age" : 30}
{"index": {"_index" : "test_query","_id":"1002"}}
{"id":"1002","name": "li si","age" : 40}
{"index": {"_index" : "test_query","_id":"1003"}}
{"id":"1003","name": "wang wu","age" : 50}
{"index": {"_index" : "test_query","_id":"1004"}}
{"id":"1004","name": "zhangsan","age" : 30}
{"index": {"_index" : "test_query","_id":"1005"}}
{"id":"1005","name": "lisi","age" : 40}
{"index": {"_index" : "test_query","_id":"1006"}}
{"id":"1006","name": "wangwu","age" : 50}
# 查询所有数据
GET test_query/_search
{
"query":{
"match_all": {}
}
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1003",
"_score": 1,
"_source": {
"id": "1003",
"name": "wang wu",
"age": 50
}
},
{
"_index": "test_query",
"_id": "1004",
"_score": 1,
"_source": {
"id": "1004",
"name": "zhangsan",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1005",
"_score": 1,
"_source": {
"id": "1005",
"name": "lisi",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1006",
"_score": 1,
"_source": {
"id": "1006",
"name": "wangwu",
"age": 50
}
}
]
}
}
match是分词匹配查询,在上面添加数据的时候因为有空格所以Elasticsearch会认为是两个关键词
GET test_query/_search
{
"query":{
"match": {
"name": "zhang li"
}
}
}
# 响应结果
{
"took": 11,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.3555918,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1.3555918,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1.3555918,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
}
}
]
}
}
查询不出来,因为这是两个关键词
# 完整的关键词查询
GET test_query/_search
{
"query":{
"term": {
"name": {
"value": "zhang san"
}
}
}
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
可以查询,因为这是完整的关键词
# 完整的关键词查询
GET test_query/_search
{
"query":{
"term": {
"name": {
"value": "zhangsan"
}
}
}
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.7836733,
"hits": [
{
"_index": "test_query",
"_id": "1004",
"_score": 1.7836733,
"_source": {
"id": "1004",
"name": "zhangsan",
"age": 30
}
}
]
}
}
对查询结果的过滤
# 对查询结果的过滤
GET test_query/_search
{
"_source": ["name","age"]
}
# 响应结果
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1,
"_source": {
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1,
"_source": {
"name": "li si",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1003",
"_score": 1,
"_source": {
"name": "wang wu",
"age": 50
}
},
{
"_index": "test_query",
"_id": "1004",
"_score": 1,
"_source": {
"name": "zhangsan",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1005",
"_score": 1,
"_source": {
"name": "lisi",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1006",
"_score": 1,
"_source": {
"name": "wangwu",
"age": 50
}
}
]
}
}
排序
# 排序
GET test_query/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "test_query",
"_id": "1003",
"_score": null,
"_source": {
"id": "1003",
"name": "wang wu",
"age": 50
},
"sort": [
50
]
},
{
"_index": "test_query",
"_id": "1006",
"_score": null,
"_source": {
"id": "1006",
"name": "wangwu",
"age": 50
},
"sort": [
50
]
},
{
"_index": "test_query",
"_id": "1002",
"_score": null,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
},
"sort": [
40
]
},
{
"_index": "test_query",
"_id": "1005",
"_score": null,
"_source": {
"id": "1005",
"name": "lisi",
"age": 40
},
"sort": [
40
]
},
{
"_index": "test_query",
"_id": "1001",
"_score": null,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
},
"sort": [
30
]
},
{
"_index": "test_query",
"_id": "1004",
"_score": null,
"_source": {
"id": "1004",
"name": "zhangsan",
"age": 30
},
"sort": [
30
]
}
]
}
}
组合查询
# 组合查询 or
GET test_query/_search
{
"query":{
"bool": {
"should": [
{
"match": {
"name": "zhang"
}
},
{
"match": {
"age": 40
}
}
]
}
}
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.3555918,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1.3555918,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1005",
"_score": 1,
"_source": {
"id": "1005",
"name": "lisi",
"age": 40
}
}
]
}
}
显示原始数据的分组查询
# 分组查询
GET test_query/_search
{
"aggs": {
"ageGroup": {
"terms": {
"field": "age"
}
}
}
}
# 响应结果
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1003",
"_score": 1,
"_source": {
"id": "1003",
"name": "wang wu",
"age": 50
}
},
{
"_index": "test_query",
"_id": "1004",
"_score": 1,
"_source": {
"id": "1004",
"name": "zhangsan",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1005",
"_score": 1,
"_source": {
"id": "1005",
"name": "lisi",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1006",
"_score": 1,
"_source": {
"id": "1006",
"name": "wangwu",
"age": 50
}
}
]
},
"aggregations": {
"ageGroup": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 30,
"doc_count": 2
},
{
"key": 40,
"doc_count": 2
},
{
"key": 50,
"doc_count": 2
}
]
}
}
}
不显示原始数据,只显示聚合结果
#不显示原始数据,只显示聚合结果
GET test_query/_search
{
"aggs": {
"ageGroup": {
"terms": {
"field": "age"
}
}
},
"size": 0
}
# 响应结果
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"ageGroup": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 30,
"doc_count": 2
},
{
"key": 40,
"doc_count": 2
},
{
"key": 50,
"doc_count": 2
}
]
}
}
}
分组之后求和
# 分组之后求和
GET test_query/_search
{
"aggs": {
"ageGroup": {
"terms": {
"field": "age"
},
"aggs": {
"ageSum": {
"sum": {
"field": "age"
}
}
}
}
},
"size": 0
}
# 响应结果
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"ageGroup": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 30,
"doc_count": 2,
"ageSum": {
"value": 60
}
},
{
"key": 40,
"doc_count": 2,
"ageSum": {
"value": 80
}
},
{
"key": 50,
"doc_count": 2,
"ageSum": {
"value": 100
}
}
]
}
}
}
求平均值
# 求平均值
GET test_query/_search
{
"aggs": {
"ageAvg": {
"avg": {
"field": "age"
}
}
},
"size": 0
}
# 响应结果
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"ageAvg": {
"value": 40
}
}
}
取前3名
# 取前3名
GET test_query/_search
{
"aggs": {
"top3": {
"top_hits": {
"size": 3
}
}
},
"size": 0
}
# 响应结果
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"top3": {
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_query",
"_id": "1001",
"_score": 1,
"_source": {
"id": "1001",
"name": "zhang san",
"age": 30
}
},
{
"_index": "test_query",
"_id": "1002",
"_score": 1,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
}
},
{
"_index": "test_query",
"_id": "1003",
"_score": 1,
"_source": {
"id": "1003",
"name": "wang wu",
"age": 50
}
}
]
}
}
}
}
根据年龄排序取前3名
# 根据年龄排序取前3名
GET test_query/_search
{
"aggs": {
"ageTop3": {
"top_hits": {
"sort": [
{
"age":{
"order": "desc"
}
}
],
"size": 3
}
}
},
"size": 0
}
# 响应结果
{
"took": 16,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"ageTop3": {
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "test_query",
"_id": "1003",
"_score": null,
"_source": {
"id": "1003",
"name": "wang wu",
"age": 50
},
"sort": [
50
]
},
{
"_index": "test_query",
"_id": "1006",
"_score": null,
"_source": {
"id": "1006",
"name": "wangwu",
"age": 50
},
"sort": [
50
]
},
{
"_index": "test_query",
"_id": "1002",
"_score": null,
"_source": {
"id": "1002",
"name": "li si",
"age": 40
},
"sort": [
40
]
}
]
}
}
}
}
分词
# 分词
GET _analyze
{
"analyzer":"ik_max_word",
"text":["你好中国人"]
}
# 响应结果
{
"tokens": [
{
"token": "你好",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "中国人",
"start_offset": 2,
"end_offset": 5,
"type": "CN_WORD",
"position": 1
},
{
"token": "中国",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "国人",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 3
}
]
}