一、Elasticsearch 基本查询
基本查询语法:
GET /索引名/_search
{
"query": {
"查询类型": {
"查询属性": "查询条件值"
}
}
}
查询类型:match_all、term、match、match_phrase、multi_match、range、fuzzy、bool 等
二、测试数据
Elasticsearch 需安装ik分词器,测试数据文章末尾。
三、基本查询
3.1、简单查询
1、查询所有
#查询所有
GET /item/_search
2、 简单查询
#简单查询
GET /item/_search?q=name:小米
3.2、match_all查询
match_all是查询全部
#查询所有
GET /item/_search
{
"query": {
"match_all": {}
}
}
3.3、term查询
1、关键词查询
term是关键词查询,term里面的name值不进行分词
-
"name": "小米" :查询name属性包含"小米"的结果
-
"name": "小米手机" :查询name属性包含"小米手机"的结果
#关键词查询
GET /item/_search
{
"query": {
"term": {
"name": "小米"
}
}
}
2、多关键词查询
多关键词查询,term里面的name值只要满足其中一个
-
"name": ["小米","apple"]:查询name属性包含"小米"或者"apple"的结果
#多关键词查询
GET /item/_search
{
"query": {
"terms": {
"name": ["小米","apple"]
}
}
}
备注:
"name" : " Apple iPhone 12",其中Apple为首字母大写,如果term为Apple,查询结果为空
我们查看分词结果,发现 “Apple iPhone 12”的分词为"apple"、"iphone"、"12",所以用Apple 查不到分词结果为空。
3、查询结果包含版本号
"version": true:查询结果返回满足条件的记录时,包含版本号信息,每次修改该条记录,版本号会加1。
#查询结果包含版本号
GET /_search
{
"version": true,
"query": {
"term": {
"name": "小米"
}
}
}
4、分页查询
查询时,使用from和to进行分页查询,其中
- "from": 分页起始位置
- "size": 每页数据大小
#分页查询
GET /item/_search
{
"query": {
"term": {
"category" : "手机"
}
},
"from": 0,
"size": 1
}

3.4、match查询
match查询是知道分词器存在的,先进行分词,再进行查询。
我们可以使用 GET _analyze 查看分词结果
- "analyzer": 使用的分词器,ik 分词器有两种分词模式:ik_max_word 和 ik_smart 模式,这里使用的是ik_smart 模式
- "text": 要进行分词的值
GET _analyze
{
"analyzer": "ik_smart",
"text": ["小米Redmi K30pro"]
}
1、关键字查询
先对match里面的name值进行分词,然后进行查询
- "name": "小米手机" :分词结果为 "小米"、 "手机",查询name包含 "小米"和 "手机"的记录
#关键字分词查询
GET /item/_search
{
"query": {
"match": {
"name": "小米手机"
}
}
}
关联查询
"小米Redmi K30pro"的分词结果为"小米"、"redmi"、"k30pro",查询条件"operator": "and",必须满足全部分词结果。
#关联查询
GET /item/_search
{
"query": {
"match": {
"name": {
"query": "小米Redmi K30pro",
"operator": "and"
}
}
}
}
查询条件"operator": "or",只需要满足其中一个分词结果。
#关联查询
GET /item/_search
{
"query": {
"match": {
"name": {
"query": "小米Redmi K30pro",
"operator": "and"
}
}
}
}
#多字段查询
#多字段查询
GET /item/_search
{
"query": {
"multi_match": {
"query": "小米",
"fields": [ "name", "brand" ]
}
}
}
#短语查询
#短语查询
GET /item/_search
{
"query": {
"match_phrase": {
"name": "Apple iPhone"
}
}
}
#短语查询
GET /item/_search
{
"query": {
"match_phrase": {
"name": "Apple iPhone"
}
}
}
结果过滤
#结果过滤
GET /item/_search
{
"_source": ["name","price"],
"query": {
"match": {
"name": "小米"
}
}
}
结果过滤
#结果过滤
GET /item/_search
{
"_source": {
"excludes": ["images", "price"]
},
"query": {
"match": {
"name": "小米"
}
}
}
模糊查询
#模糊查询
GET /item/_search
{
"query": {
"fuzzy": {
"name": "Apples"
}
}
}
范围查询
#范围查询
GET /item/_search
{
"query": {
"range": {
"price":{
"gt": 6000,
"lte": 7000
}
}
}
}
#通配符
#通配符查询
GET /item/_search
{
"_source": {
"excludes": ["cate*","*s"]
},
"query": {
"match": {
"name": "小米"
}
}
}
#前缀匹配
#前缀匹配查询
GET /item/_search
{
"query": {
"match_phrase_prefix": {
"name": "小"
}
}
}
#范围查询
#范围查询
GET /item/_search
{
"query": {
"range": {
"price":{
"from": 5000,
"to": 6999
}
}
}
}
#范围查询不包含边界
#范围查询不包含边界
GET /item/_search
{
"query": {
"range": {
"price":{
"from": 5000,
"to": 6999,
"include_lower":false,
"include_upper":false
}
}
}
}
#通配符查询
#通配符查询
GET /item/_search
{
"query": {
"wildcard": {
"category": "笔记本?"
}
}
}
#通配符查询
GET /item/_search
{
"query": {
"wildcard": {
"category": "笔记本电?"
}
}
}
#通配符查询
GET /item/_search
{
"query": {
"wildcard": {
"category": "笔记*"
}
}
}
must查询
#must查询
GET /item/_search
{
"query": {
"bool": {
"must": [{
"match": {
"brand": "苹果"
}
},
{
"range": {
"price": {
"gt": 5000,
"lte": 9000
}
}
}]
}
}
}
should查询
#must查询
GET /item/_search
{
"query": {
"bool": {
"should": [{
"match": {
"brand": "苹果"
}
},
{
"range": {
"price": {
"gt": 5000,
"lte": 9000
}
}
}]
}
}
}
must_not查询 范围查询影响分数
#must_not查询
GET /item/_search
{
"query": {
"bool": {
"must_not": [{
"match": {
"brand": "小米"
}
},
{
"range": {
"price": {
"gt": 5000,
"lte": 9000
}
}
}]
}
}
}
过滤查询
#过滤查询
GET /item/_search
{
"query": {
"bool": {
"should": [{
"match": {
"name": "苹果"
}
}],
"filter": {
"range": {
"price": {
"gt": 5000,
"lte": 6000
}
}
}
}
}
}
排序
#排序
GET /item/_search
{
"query": {
"match": {
"brand": "苹果"
}
},
"sort": [
{
"id": {
"order": "desc"
}
}
]
}
PUT /item
{
"mappings" : {
"properties" : {
"id" : {
"type" : "long"
},
"name" : {
"type" : "text",
"analyzer" : "ik_smart"
},
"title" : {
"type" : "text",
"index": true,
"analyzer" : "ik_smart"
},
"price" : {
"type" : "double"
},
"brand" : {
"type" : "keyword"
},
"category" : {
"type" : "keyword"
},
"images" : {
"type" : "keyword",
"index" : false
}
}
},
"settings" : {
"index" : {
"number_of_shards":3,
"number_of_replicas":0
}
}
}
POST /item/_doc/1
{
"id": 1,
"name": "小米10至尊纪念版",
"title": "小米10至尊纪念版 8G 256G 骁龙865",
"brand": "小米",
"category": "手机",
"images": "https://img.jeespring.com/01.jpg",
"price": 5699.00
}
POST /item/_doc/2
{
"id": 2,
"name": "Redmi K30 至尊纪念版",
"title": "Redmi K30 至尊纪念版 天玑1000plus",
"brand": "小米",
"category": "手机",
"images": "https://img.jeespring.com/02.jpg",
"price": 2299.00
}
POST /item/_doc/3
{
"id": 3,
"name": " Apple iPhone 12",
"title": "Apple iPhone 12 (A2404) 128GB 蓝色",
"brand": "苹果",
"category": "手机",
"images": "https://img.jeespring.com/03.jpg",
"price": 6999.00
}
POST /item/_doc/4
{
"id": 4,
"name": "荣耀智慧屏X1",
"title": "荣耀智慧屏X1 65英寸2G+16G 4K超清",
"brand": "华为",
"category": "平板电视",
"images": "https://img.jeespring.com/04.jpg",
"price": 3699.00
}
POST /item/_doc/5
{
"id": 5,
"name": "联想ThinkBook 15p",
"title": "联想ThinkBook 15p 十代i7 16G 512G",
"brand": "联想",
"category": "笔记本电脑",
"images": "https://img.jeespring.com/05.jpg",
"price": 7699.00
}
POST /item/_doc/6
{
"id": 6,
"name": "Apple MacBook Pro 16",
"title": "Apple MacBook Pro 16 i7 16G 512G灰",
"brand": "苹果",
"category": "笔记本电脑",
"images": "https://img.jeespring.com/06.jpg",
"price": 16699.00
}