首页 > 解决方案 > bool 查询不支持 [search_after] -- 弹性搜索错误

问题描述

我正在尝试同时查询我的索引并根据地理距离进行过滤,尽管通过我的索引进行分页但我得到了这个错误

错误:

{
    "error": {
        "root_cause": [
            {
                "type": "parsing_exception",
                "reason": "bool query does not support [search_after]",
                "line": 7,
                "col": 21
            }
        ],
        "type": "parsing_exception",
        "reason": "bool query does not support [search_after]",
        "line": 7,
        "col": 21
    },
    "status": 400
}

实际查询:

{
    "query": {
        "bool" : {
            "should" : {
                "match_all" : {}
            },
            "search_after": [1463538857, "654323"],
            "filter" : {
                "geo_distance" : {
                    "distance" : "150km",
                    "location" : {
                        "lat" : xxxx,
                        "lon" : xxxxx
                    }
                }
            }
        }
    }
 }

标签: elasticsearchelastic-stackelk

解决方案


尝试search_after摆脱query

{
    "query": {
        "bool" : {
            "should" : {
                "match_all" : {}
            },
            "filter" : {
                "geo_distance" : {
                    "distance" : "150km",
                    "location" : {
                        "lat" : xxxx,
                        "lon" : xxxxx
                    }
                }
            }
        }
    }
    search_after": [1463538857, "654323"]
 }

因此,顾名思义search_after,将在给定值后开始匹配。您需要为此指定一些排序。例如在文档中的示例

GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "search_after": [1463538857, "654323"],
    "sort": [
        {"date": "asc"},
        {"tie_breaker_id": "asc"}
    ]
}

首先根据datetie_breaker_id字段对文档进行排序,因此"search_after": [1463538857, "654323"]语句意味着在日期1463538857和 tie_breaker_id之后开始搜索"654323"

因此,您需要在这里做的是根据某些字段对文档进行排序,然后提供 search_after 所需的值。


推荐阅读