Elasticsearch-25-Query DSL常用查询

Query DSL的常用的几种查询语法

match all查询

查询全部

1
2
3
4
5
6
GET /index/type/_search
{
"query":{
"match_all":{}
}
}

match查询

指定field搜索条件查询, 搜索的关键词会被分词

1
2
3
4
5
6
7
8
GET /_search
{
"query": {
"match": {
"field": "text"
}
}
}

multi match

搜索条件在多个field上进行查询, 搜索条件也会被分词

1
2
3
4
5
6
7
8
9
GET /_search
{
"query": {
"multi_match": {
"query": "text",
"fields": ["field1","field2"]
}
}
}

range query

在区间范围内查询

1
2
3
4
5
6
7
8
9
10
11
GET /_search
{
"query": {
"range": {
"field": {
"gte": 0,
"lte": 10
}
}
}
}

term query

搜索条件不去进行分词查询,同样的,只能查询设置为不分词的field

1
2
3
4
5
6
7
8
GET /_search
{
"query": {
"term": {
"field": "text"
}
}
}

terms query

一个field 去匹配多个值

1
2
3
4
5
6
7
8
9
10
11
GET /_search
{
"query": {
"terms": {
"field": [
"text1",
"text2"
]
}
}
}

filter

之前有说过filter是不计算相关度分数的,就是直接把符合条件的数据筛选出来
如果只用filter过滤的话 需要加”constant_score” 例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET _search
{
"query": {
"constant_score": {
"filter": {
"range": {
"field": {
"gte": 10,
"lte": 20
}
}
}
}
}
}

定位搜索不合法的原因

语法:

1
2
3
4
GET index/type/_validate/query?explain
{
// 搜索条件
}

示例

我们先来写一个错误的查询来试一下

1
2
3
4
5
6
7
8
GET test_index/test_type/_validate/query?explain
{
"query": {
"math": { // 应该是match 写成了 math
"test_field": "text"
}
}
}

返回值:

1
2
3
4
{
"valid": false,
"error": "org.elasticsearch.common.ParsingException: no [query] registered for [math]"
}

再来试一个正确的

1
2
3
4
5
6
7
8
GET test_index/test_type/_validate/query?explain
{
"query": {
"match": {
"test_field": "text"
}
}
}

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"valid": true,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"explanations": [
{
"index": "test_index",
"valid": true,
"explanation": "+test_field:text #(#_type:test_type)"
}
]
}

一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这个时候可以先用validate api去验证一下,搜索是否合法

定制排序规则

默认情况下,es是按照_score去排序的,然后某些情况下,可能没有有用的 _score,比如说filter ,那么我们如何使用自己的排序规则呢?

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /index/type/_search
{
"query":{
...
},
"sort":[
{
"field":{
"order":"desc"
}
}
]
}

就是在query后面加一个sort来进行排序,指定用哪一个field,和升序还是降序