Query DSL的常用的几种查询语法
match all查询
查询全部1
2
3
4
5
6GET /index/type/_search
{
"query":{
"match_all":{}
}
}
match查询
指定field搜索条件查询, 搜索的关键词会被分词1
2
3
4
5
6
7
8GET /_search
{
"query": {
"match": {
"field": "text"
}
}
}
multi match
搜索条件在多个field上进行查询, 搜索条件也会被分词1
2
3
4
5
6
7
8
9GET /_search
{
"query": {
"multi_match": {
"query": "text",
"fields": ["field1","field2"]
}
}
}
range query
在区间范围内查询1
2
3
4
5
6
7
8
9
10
11GET /_search
{
"query": {
"range": {
"field": {
"gte": 0,
"lte": 10
}
}
}
}
term query
搜索条件不去进行分词查询,同样的,只能查询设置为不分词的field1
2
3
4
5
6
7
8GET /_search
{
"query": {
"term": {
"field": "text"
}
}
}
terms query
一个field 去匹配多个值1
2
3
4
5
6
7
8
9
10
11GET /_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
15GET _search
{
"query": {
"constant_score": {
"filter": {
"range": {
"field": {
"gte": 10,
"lte": 20
}
}
}
}
}
}
定位搜索不合法的原因
语法:1
2
3
4GET index/type/_validate/query?explain
{
// 搜索条件
}
示例
我们先来写一个错误的查询来试一下1
2
3
4
5
6
7
8GET 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
8GET 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
13GET /index/type/_search
{
"query":{
...
},
"sort":[
{
"field":{
"order":"desc"
}
}
]
}
就是在query后面加一个sort来进行排序,指定用哪一个field,和升序还是降序