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"
      }
    }
  ]
}
posted @ 2024-04-25 17:20  py卡卡  阅读(5)  评论(0编辑  收藏  举报