数据准备
查询字符串
将查询条件全都放在请求路径中。
1、查询所有文档:
GET /product/sku/_search
返回结果:
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "product",
"_type": "sku",
"_id": "2",
"_score": 1,
"_source": {
"name": "huawei002",
"category": "phone",
"brand": "huawei",
"price": 99.99,
"stock": 100,
"tag": [
"b",
"c"
],
"delete": false,
"desc": "abc,def,hij",
"create_time": "2015-05-11",
"modify_time": "2015-05-20"
}
},
...
]
}
}
返回参数说明:
took
:该操作耗费的时间(ms);
timed_out
:是否超时;
hits
:查到的数据;
total
:记录条数;max_score
:最高的匹配度;hits
:结果集列表;
2、查询指定字段:
GET /product/sku/_search?q=name:huawei001
3、排序:
GET /product/sku/_search?sort=price:desc
4、查询指定的字段:
GET /product/sku/1?_source=name
term
查询
1、查询包含有指定关键字的文档:
GET /product/sku/_search
{
"query": {
"term": {
"name": "huawei001"
}
}
}
2、关键字可以传多个:
GET /product/sku/_search
{
"query": {
"terms": {
"name": ["huawei001","huawei002"]
}
}
}
match
查询
match与term的区别:match查询会先分词在查询倒排索引,而term是直接查询倒排索引;所以对于条件"name": "huawei001 pingguo001"
,match能查到结果,而term则查不到:
GET /product/sku/_search
{
"query": {
"match": {
"name": "huawei001 pingguo001"
}
}
}
multi_match
说明:指定多个字段查询。
查询name 或 brand 中有"huawei"的文档:
GET /product/sku/_search
{
"query": {
"multi_match": {
"fields":["name","brand"],
"query":"huawei"
}
}
}
match_phrase
说明:短语匹配查询。
把 "huawei001 pingguo001"作为一个整体去查询,需要完全匹配,所以下面的示例会查不到结果:
GET /product/sku/_search
{
"query": {
"match_phrase": {
"name": "huawei001 pingguo001"
}
}
}
match_phrase_prefix
说明:短语前缀匹配查询。
查询 name 以"huawei" 开头的文档:
GET /product/sku/_search
{
"query": {
"match_phrase_prefix": {
"name": "huawei"
}
}
}
wildcard查询
说明:可以使用通配符 *
和 ?
来查询。
符号 | 说明 |
---|---|
* | 0个或多个字符 |
? | 任意一个字符 |
示例
GET /product/sku/_search
{
"query": {
"wildcard": {
"name": "huawei*"
}
}
}
fuzzy查询
说明:模糊查询。
下面的示例中,查询 huawei1 能把 huawei001 对应的文档查出来:
GET /product/sku/_search
{
"query": {
"fuzzy": {
"name": "huawei1"
}
}
}
范围查询
参数说明
参数 | 说明 |
---|---|
from | 最小值 |
to | 最大值 |
include_lower | 是否包含左边界,默认true |
include_upper | 是否包含右边界,默认true |
示例
1、查询 2015-05-01 <= create_time <= 2015-05-10
的文档:
GET /product/sku/_search
{
"query": {
"range": {
"create_time": {
"from": "2015-05-01",
"to": "2015-05-10"
}
}
}
}
2、查询 2015-05-01 < create_time < 2015-05-10
的文档:
GET /product/sku/_search
{
"query": {
"range": {
"create_time": {
"from": "2015-05-01",
"to": "2015-05-10",
"include_lower": false,
"include_upper": false
}
}
}
}
bool过滤
参数 | 说明 |
---|---|
must | 满足所有条件 (and ) |
should | 满足其中之一即可 (or ) |
must_not | 不需要满足的条件(not ) |
1、查询 name 为 huawei001 ,并且 brand 为 huawei 的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"must": [
{"term": {"name": "huawei001"}},
{"term": {"brand": "huawei"}}
]
}
}
}
2、查询 name 为 huawei001 ,或者 brand 为 sanxing 的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"should": [
{"term": {"name": "huawei001"}},
{"term": {"brand": "sanxing"}}
]
}
}
}
3、查询 brand 不是 huawei 的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"must_not": [
{"term": {"brand": "huawei"}}
]
}
}
}
4、组合过滤;
查询 brand 是 huawei ,并且 name 不是 huawei001 的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"must": [
{"term": {"brand": "huawei"}}
],
"must_not": [
{"term": {"name": "huawei001"}}
]
}
}
}
5、嵌套过滤;
查询 brand 是 sanxing ,或者 name 是 huawei001 的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"should": [
{"term": {"brand": "sanxing"}},
{
"bool": {
"must": [
{"term": {"name": "huawei001"}}
]
}
}
]
}
}
}
范围过滤
参数 | 说明 |
---|---|
gt | 大于 |
lt | 小于 |
gte | 大于等于 |
lte | 小于等于 |
查询 100 < price < 1000
的文档:
GET /product/sku/_search
{
"query": {
"bool": {
"filter": {
"range": {
"price": {
"gt": 100,
"lt": 1000
}
}
}
}
}
}
指定返回的字段
1、只返回字段 name:
GET /product/sku/_search
{
"_source":"name"
}
2、返回多个字段:
GET /product/sku/_search
{
"_source": ["name","brand"]
}
3、使用通配符指定,以 "nam"开头的所有字段:
GET /product/sku/_search
{
"_source":"nam*"
}
4、使用 includes,包含指定的字段:
GET /product/sku/_search
{
"_source": {
"includes": ["name","brand"]
}
}
5、使用 excludes,排除指定的字段:
GET /product/sku/_search
{
"_source": {
"excludes": ["name","brand"]
}
}
排序
desc:降序;asc:升序。
1、价格从高到低排序:
GET /product/sku/_search
{
"sort": {
"price": {
"order": "desc"
}
}
}
2、按名称排序:
GET /product/sku/_search
{
"sort": {
"name.raw": {
"order": "desc"
}
}
}
名称是text
类型,所以会分词;若直接按name
排序,会有问题,所以这里用name.raw
。
分页
from:偏移量;size:每页条数;
GET /product/sku/_search
{
"from": 0,
"size": 1,
"query": {
"term": {
"brand": "huawei"
}
}
}
查询版本号
GET /product/sku/_search
{
"version":true
}
mget
批量查询
1、查询id为1和2的文档,只返回name字段:
POST /product/sku/_mget
{
"docs": [
{
"_id": 1,
"_source": "name"
},
{
"_id": 2,
"_source": "name"
}
]
}
2、查询id为1和2的文档:
POST /product/sku/_mget
{
"ids" : [ "1", "2" ]
}