Elasticsearch - 定位错误语法、定制排序规则
定位错误语法
比如查询一个name/desc中包含google的数据,结果输入关键词有误,就会包错,
"unknown query [mul_match] did you mean any of [multi_match, match]?"
GET /book01/_search
{
"query": {
"mul_match": {
"query": "google",
"fields": ["name", "desc"] # 搜索涉及的字段列表
}
}
}
排查错误位置:
通过 GET /{index}/_validate/query?explain + 查询条件
GET /book01/_validate/query?explain
{
"query": {
"mul_match": {
"query": "google",
"fields": ["name", "desc"] # 搜索涉及的字段列表
}
}
}
查询条件合法的情况下会返回搜索的目标等信息
GET /book01/_validate/query?explain
{
"query": {
"multi_match": {
"query": "google",
"fields": ["name", "desc"] # 搜索涉及的字段列表
}
}
}
场景:一般用在那种特别复杂庞大的搜索下,比如你一下子写了上百行的搜索,这时可以先用validate api去验证一下,搜索是否合法。
合法以后,explain就像mysqI的执行计划,可以看到搜索的目标等信息。
定制排序规则
默认情况下,是按照_score降序排序的,然而,某些情况下,可能没有有用的_score,比如说filter
只使用过滤器的方式查询数据:
错误方式:
GET /book/_search
{
"query": {
"filter": {
"range": {
"price": {
"gte": 7,
"lte": 20
}
}
}
}
}
正确方式: 使用关键词:constant_score
GET /book/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 7,
"lte": 20
}
}
}
}
}
}
此时返回的 "_score": 1
想要将通过filter查询出的数据在再根据某个字段排序时,写法:
GET /book/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"price": {
"gte": 7,
"lte": 20
}
}
}
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}