Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

elasticsearch---查询

数据准备

测试数据

查询字符串

将查询条件全都放在请求路径中。
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" ]
}