{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671509005013,"data":{"id":71714052,"title":"18.5.1 关键字搜索v2.0结果筛选","slug":"bouwyb","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

概述

关键字搜索功能在按类型(比如:美食、酒店、购物等)搜索场景下,支持对搜索下发的结果进行筛选。

筛选是以二次搜索的方式进行,上层首次按类型搜索时,AutoSDK将透出所支持的筛选参数,然后,通过获取筛选参数后发起二次搜索进行筛选过滤,从而下发满足用户需求的POI。

场景图

关键参数

首次搜索

SearchClassifyParam com.autonavi.gbl.search.model.KeywordSearchTQueryParam.customParam.classifyParam


SearchClassifyInfo com.autonavi.gbl.search.model.KeywordSearchResultV2.classify

二次搜索

SearchClassifyParam com.autonavi.gbl.search.model.KeywordSearchTQueryParam.customParam.classifyParam

核心接口

int com.autonavi.gbl.search.SearchService.keyWordSearch(SearchKeywordParam param, IGSearchKeyWordObserver observer, @SearchMode.SearchMode1 int mode, int taskid)


备注:接口使用请参照文档:关键字搜索


调用示例(以搜索美食类型为例)

public class SearchRequest\n{\n    // 请求函数\n\tpublic void doKeywordSearch()\n    {\n        // 1. 获取自车位所在经纬度\n        Coord2DDouble carPos = getCarLocation();\n        \n        // 2. 通过经纬度获取自车位所在城市编码\n        MapDataService mapDataService = getMapDataService(); // 获取地图数据服务,com.autonavi.gbl.data.MapDataService\n        int adCodeCarLoc =  mapDataService.getAdcodeByLonLat(carPos.lon, arPos.lat);\n        \n        // 3. 根据搜索场景计算搜索中心poiLoc以及搜索城市编码adCode\n        Coord2DDouble poiLoc;\n        int adCode;\n        switch (getSearchSceneType(1))\n        {\n            case SEARCH_SCENE_TYPE_ALONG_WAY:\n            {\n                /**< 沿途搜时以自车位为搜索中心点 */\n                poiLoc = carPos;\n                adCode = adCodeCarLoc;\n            \tbreak;\n            }\n            default:\n            {\n                // 获取当前地图中心点坐标\n            \tCoord2DDouble mapCenter = getMapCenter();\n                int adCodeMapCenter;\n                if (false == IsNetConnected) // 是否联网\n                {\n                \t/**< 离线时从当前搜索城市信息中获取adcode,例如选择在北京市离线搜索 */\n                    adCodeMapCenter = getOfflineSearchAdcode();\n                }\n                else\n                {\n                \tadCodeMapCenter = mapDataService.getAdcodeByLonLat(mapCenter.lon, mapCenter.lat);\n                }\n                \n                if ((adCodeCarLoc == adCodeMapCenter) || (adCodeMapCenter<0))\n                {\n                \t/**< 自车位与图面中心点所在城市为同一城市或无法获取地图中心点adcode时, 框搜以自车位为搜索中心点 */\n                    poiLoc = carLoc;\n                    adCode = adCodeCarLoc\n                }\n                else\n                {\n                \t/**< 自车位与图面中心点所在城市不为同一城市, 框搜以图面中心点为搜索中心点 */\n                    poiLoc = mapCenter;\n                    adCode = adCodeMapCenter;\n                }\n            }  \n        }\n        \n        // 4. 构建参数\n        KeywordSearchTQueryParam param;\n        param.keywords = "美食";  // 替换为输入框输入的搜索关键字\n        param.offlineParam.adcode = adcode;\n        param.city = adcode;\n        /* 搜索中心点坐标 */\n        param.poiLoc = poiLoc;\n        /* 自车位坐标 */\n        param.userLoc = carPos;\n        param.searchOperate = 1; // 框搜\n        /* 获取框搜范围,对角线两个点的坐标 */\n        param.geoObj = getGeoObj();\n        param.pageParam.pageSize = 10;\n\t\tparam.offlineParam.resultMaxCount = 200;\n        param.customParam.classifyParam.checkedLevel = "3";\n        \n        // 5. 回调观察者\n        SearchKeyWordObserver searchKeywordObserver = new SearchKeyWordObserver();\n        \n        // 6. 生成唯一的任务id\n        taskId = 1;\n        \n        // 发起关键字搜索\n\t\tint iret = SearchServiceV2.KeyWordSearchTQuery(param, searchKeywordObserver, SEARCH_MODE_ONLINE_ADVANCED, taskId);\n    }\n    \n    // 获取自车位当前经纬度\n    private Coord2DDouble getCarLocation()\n    {\n        Coord2DDouble carPos; // 自车位所在2D经度、纬度\n       \tBizCarControl bizCarControl = getBizCarControl();\t// 获取车标类图层控制 com.autonavi.gbl.layer.BizCarControl\n        CarLoc carLoc = bizCarControl.getCarPosition();\n        if (carLoc.vecPathMatchInfo.size() > 0)\n        {\n        \tcarPos.lon = vecPathMatchInfo.get(0).longitude;\n            carPos.lat = vecPathMatchInfo.get(0).latitude;\n        }\n        \n        return carPos;\n    }\n    \n    /* 获取地图中心点坐标 */\n    private Coord2DDouble  getMapCenter()\n    {\n    \tCoord3DDouble mapCenter3D;\n        Coord2DDouble mapCenter;\n        \n        OperatorPosture operatorPosture = getOperatorPosture(); // 获取地图姿态操作接口, com.autonavi.gbl.map.OperatorPosture\n        mapCenter3D = operatorPosture.getMapCenterByLonLat();\n        \n        mapCenter.lon = mapCenter3D.lon;\n        mapCenter.lat = mapCenter3D.lat;\n        \n        return mapCenter;\n    }\n    \n    /* 获取关键搜索场景 */\n  \tpublic SearchSceneType getSearchSceneType(int i)\n    {\n    \tif (0 == i)\n        {\n        \treturn SEARCH_SCENE_TYPE_ALONG_WAY;\n        }\n        else if (1 == i)\n        {\n        \treturn SEARCH_SCENE_TYPE_NORMAL;\n        }\n        else\n        {\n        \treturn SEARCH_SCENE_TYPE_MAX;\n        }\n    }\n    \n    /* 将显示区域转换为对角线坐标字符串 */\n    private String getGeoObj(Coord2DDouble carPos)\n    {\n        /* 自车位经纬度转地图P20坐标 */\n        OperatorPosture operatorPosture = getOperatorPosture(); // 获取地图姿态操作接口,com.autonavi.gbl.map.OperatorPosture\n        double mapX = operatorPosture.lonLatToMap(carPos.lon, carPos.lat).lon;\n        double mapY = operatorPosture.lonLatToMap(carPos.lon, carPos.lat).lat;\n        \n        /* 获取当前显示的地图范围 */\n        MapBound mapBound = operatorPosture.getMapBound();\n        int width   = mapBound.width / 2;\n        int height  = mapBound.height / 2;\n        \n        RectInt mapRect;\n        mapRect.left = mapX - width;\n        mapRect.right = mapX + width;\n        mapRect.top = mapY - height;\n        mapRect.bottom = mapY + height;\n        \n        Coord2DDouble leftTop;\n        operatorPosture.mapToLonLat(mapRect.left, mapRect.top, leftTop.lon, leftTop.lat);\n        Coord2DDouble bottomRight;\n        operatorPosture.mapToLonLat(mapRect.right, mapRect.buttom, bottomRight.lon, bottomRight.lat);\n        \n        String geoobj;\n        geoobj += leftTop.lon + "|" + leftTop.lat + "|" + bottomRight.lon + "|" + bottomRight.lat;\n        \n        return geoobj;\n    }\n}
class SearchKeyWordObserver implements IKeyWordSearchObserverV2 {\n    static public SearchClassifyInfo  _classify;\t/**< 筛选数据 */\n    @Override\n    public void onGetKeyWordResult(int taskid, int euRet, KeywordSearchResultV2 pstResult) {\n\n        Log.i(TAG, "onGetKeyWordResult: ");\n        Log.i(TAG, " taskid = " + taskid);\n        Log.i(TAG, " euRet = " + euRet);\n        if (stResult != null) {\n            Log.i(TAG, " message = " + stResult.message);\n            Log.i(TAG, " keyword = " + stResult.keyword);\n\n            if (stResult.poiList != null && stResult.poiList.length > 0) {\n                if (stResult.poiList[0].poi != null) {\n                    Log.i(TAG, " address = " + stResult.poiList[0].basicInfo.address);\n                    Log.i(TAG, " poiid = " + stResult.poiList[0].basicInfo.poiId);\n                    Log.i(TAG, " name = " + stResult.poiList[0].basicInfo.name);\n                    \n                    // TODO : 该代码片段仅解释说明如何获取筛选数据\n                    _classify.classifyItemInfo = stResult.classify.classifyItemInfo;\n                    _classify.retainState = stResult.classify.retainState;\n                }\n            }\n        }\n    }\n}
{\n    "item_data": {\n        "checked_nodes": [// 所有选中的, 选项\n            {\n                "id": "searchlist_enjoy_sort_price_desc",   //筛选框id\n                "value": "sort_rule=5;sort_fields=averagecost:d;reserved_keywords=true",   //筛选框值\n                "name": "高价优先"   //端上的筛选框展示的内容\n            }\n        ],\n        "checked_value": { // 端使用,选中的选项的value值,按不同的筛选级别拆分的。端根据选中项渲染相应组件。\n            "classify_v2_level3_data": "enjoy_custom_koubeidiscount_none",   //三筛值\n            "classify_v2_level2_data": "", // 二筛值\n            "classify_v2_data": "searchlist_distance_default_item+searchlist_enjoy_distance_none+searchlist_enjoy_sort_price_desc+invalid_common_classify_id"   //一筛值,用+组合多值。端根据值渲染相关组件。\n        },\n        "default_position_data": [//当位置距离下数据加载失败时,兜底内容\n            {\n                "category": [   //表示该框下的所有筛选项子集\n                    {\n                        "default": 1,   //筛选框展示时默认展示状态,1.选中默认展示,非用户操作前的展示项\n                        "params": "classify_v2_data",   //指明该value值需要通过什么key回传\n                        "checked": 1,   //选中状态,1选中。未选中此字段不存在\n                        "name": "默认距离",   //端上的筛选框展示的内容\n                        "value": "searchlist_distance_default_item"   //筛选框值\n                    }\n                ],\n                "checked": 1,   //选中状态,1选中。未选中此字段不存在\n                "name": "默认距离",   //端上的筛选框展示的内容\n                "is_cancel_default_select": 1,   //表示是否取消默认选择,就是端上不处理default字段,选中的逻辑完全在服务端控制\n                "separator": "+",   //多个值之间的分隔符\n                "params": "classify_v2_data",   //指明该value值需要通过什么key回传\n                "type": "group",   //有group和more,group_more,check_group,check_group_compose五种,\n                "is_no_btn": 1   //表示这个框是否需要重置按钮,1 为不需要,其他需要\n            }\n        ],\n        "level3_data": {// 三筛数据\n            "category": [\n                {\n                    "default": 1,   //筛选框展示时默认展示状态,1.选中默认展示,非用户操作前的展示项\n                    "params": "classify_v2_level3_data",   //指明该value值需要通过什么key回传\n                    "checked": 1,   //选中状态,1选中。未选中此字段不存在\n                    "name": "全部门店",   //端上的筛选框展示的内容\n                    "value": "enjoy_custom_koubeidiscount_none"   //筛选框值\n                },\n                {\n                    "params": "classify_v2_level3_data",\n                    "name": "高德优惠门店",\n                    "value": "enjoy_custom_koubeidiscount"\n                }\n            ],\n            "hot": 0,   //三筛样式 ,端上展示hot icon\n            "filter_type": 1   //三筛样式,手机端使用。 US下发,BL删除此字段不对外。\n        },\n        "level2_data": [ // 二筛数据\n            {\n              \t"category": [\n                  {\n                    "name": "特惠洗车",\n                    "value": "searchlist_carsvs_bk_tquery_xiche",\n                    "show_type": "text",\n                    "params": "classify_v2_level2_data"\n                  },\n                ],\n                "name": "二筛",   //端上的筛选框展示的内容\n                "is_cancel_default_select": 1,   //表示是否取消默认选择,就是端上不处理default字段,选中的逻辑完全在服务端控制\n                "separator": "+",   //多个值之间的分隔符\n                "params": "classify_v2_data",   //指明该value值需要通过什么key回传\n                "type": "group",   //有group和more,group_more,check_group,check_group_compose五种,\n                "is_no_btn": 1   //表示这个框是否需要重置按钮,1 为不需要,其他需要\n            }\n        ],\n        "data": [ // 一筛数据\n            {\n                "category": [   //表示该框下的所有筛选项子集\n                    {\n                        "category": [   //表示该框下的所有筛选项子集\n                            {\n                                "checked": 1,   //选中状态,1选中。未选中此字段不存在\n                                "name": "默认距离",   //端上的筛选框展示的内容\n                                "component_type": "distance",   //筛选项类型\n                                "default": 1,   //筛选框展示时默认展示状态,1.选中默认展示,非用户操作前的展示项\n                                "value": "searchlist_enjoy_distance_none",   //筛选框值\n                                "params": "classify_v2_data"   //指明该value值需要通过什么key回传\n                            },\n                            {\n                                "component_type": "distance",\n                                "params": "classify_v2_data",\n                                "name": "500米",\n                                "value": "searchlist_enjoy_distance_500"\n                            },\n                            {\n                                "component_type": "distance",\n                                "params": "classify_v2_data",\n                                "name": "1000米",\n                                "value": "searchlist_enjoy_distance_1000"\n                            },\n                            {\n                                "component_type": "distance",\n                                "params": "classify_v2_data",\n                                "name": "2000米",\n                                "value": "searchlist_enjoy_distance_2000"\n                            },\n                            {\n                                "component_type": "distance",\n                                "params": "classify_v2_data",\n                                "name": "5000米",\n                                "value": "searchlist_enjoy_distance_5000"\n                            },\n                            {\n                                "component_type": "distance",\n                                "params": "classify_v2_data",\n                                "name": "全城",\n                                "value": "searchlist_enjoy_distance_city"\n                            }\n                        ],\n                        "params": "classify_v2_data",\n                        "checked": 1,\n                        "name": "直线距离",\n                        "component_type": "distance"\n                    },\n                    {\n                        "area_subway_mark": 3,\n                        "params": "classify_v2_data",\n                        "name": "常用",\n                        "classify_item_type": "position"\n                    },\n                    {\n                        "area_subway_mark": 1,\n                        "params": "classify_v2_data",\n                        "name": "区域"\n                    },\n                    {\n                        "area_subway_mark": 2,\n                        "params": "classify_v2_data",\n                        "name": "地铁"\n                    }\n                ],\n                "checked": 1,   //选中状态,1选中。未选中此字段不存在\n                "name": "位置距离",   //端上的筛选框展示的内容\n                "use_commonly_used_config": 1,   //表示该节点下需要【常用】集合(常用节点的数据端自己组合)\n                "is_cancel_default_select": 1,   //表示是否取消默认选择,就是端上不处理default字段,选中的逻辑完全在服务端控制\n                "separator": "+",   //多个值之间的分隔符\n                "classify_item_type": "position",   //筛选框类型\n                "use_remote_config": 1,   //表示有需要远程访问的数据(如商圈、地铁)\n                "params": "classify_v2_data",   //指明该value值需要通过什么key回传\n                "use_local_config": 0,   //表示有需要端本地的数据;选项中会标识需要什么类型的\n                "type": "group",   //有group和more,group_more,check_group,check_group_compose五种,控制选项的展示效果\n                "is_no_btn": 1   //表示这个框是否需要重置按钮, 1 为不需要,其他需要\n            },\n          \t{\n               "category": [    //酒店品类特有一筛结构。\n                  {\n                     "category": [\n                        {\n                           "checked": 1,\n                           "classify_item_type": "hotel_star",\n                           "clear_brother": 1,\n                           "default": 1,\n                           "name": "不限",\n                           "params": "classify_v2_data",\n                           "value": "searchlist_hotel_star_none"\n                        },\n                        {\n                           "classify_item_type": "hotel_star",\n                           "name": "经济型",\n                           "params": "classify_v2_data",\n                           "value": "searchlist_hotel_star_economy"\n                        }\n                     ],\n                     "checked": 1,\n                     "classify_item_type": "hotel_star",\n                     "multi_select": 1,\n                     "name": "星级(可多选)",\n                     "params": "classify_v2_data",\n                     "type": "check_group"\n                  },\n                  {\n                     "category": {\n                        "from": 0,   //起始价格\n                        "range": [    //价格区间范围list(滑动条使用)\n                           {\n                              "checked": 1,\n                              "classify_item_type": "hotel_price",\n                              "default": 1,\n                              "name": "0",\n                              "params": "classify_v2_data",\n                              "tab_selected": 1,\n                              "value": "searchlist_hotel_price_range_step0"\n                           },\n                           {\n                              "classify_item_type": "hotel_price",\n                              "name": "50",\n                              "params": "classify_v2_data",\n                              "value": "searchlist_hotel_price_range_step50"\n                           }\n                        ],\n                        "range_group": [    //价格区间(快捷按钮)\n                           {\n                              "checked": 1,\n                              "classify_item_type": "hotel_price",\n                              "from": 0,\n                              "name": "¥0-150",\n                              "params": "classify_v2_data",\n                              "to": 150,\n                              "tab_selected": 1,\n                              "value": "searchlist_hotel_price_range_0_150"\n                           }\n                        ],\n                        "step": 50,  //价格变化步长\n                        "to": 1000    //最终价格\n                     },\n                     "checked": 1,\n                     "classify_item_type": "hotel_price",\n                     "layout_id": "coordinate_axis_tab_list",\n                     "multi_select": 1,\n                     "name": "价格",\n                     "params": "classify_v2_data",\n                     "tab_selected": 1,\n                     "type": "range"\n                  }\n               ],\n               "checked": 1,\n               "multi_select": 1,\n               "name": "星级价格",\n               "params": "classify_v2_data",\n               "separator": "+",\n               "tab_selected": 1,\n               "type": "more"\n            },\n            {\n                "category": [\n                    {\n                        "default": 1,\n                        "params": "classify_v2_data",\n                        "name": "推荐排序",\n                        "value": "searchlist_enjoy_sort_default"\n                    },\n                    {\n                        "params": "classify_v2_data",\n                        "name": "距离优先",\n                        "value": "searchlist_enjoy_sort_distance"\n                    },\n                    {\n                        "params": "classify_v2_data",\n                        "name": "好评优先",\n                        "value": "searchlist_enjoy_sort_comments"\n                    },\n                    {\n                        "params": "classify_v2_data",\n                        "name": "低价优先",\n                        "value": "searchlist_enjoy_sort_price_asc"\n                    },\n                    {\n                        "params": "classify_v2_data",\n                        "checked": 1,\n                        "name": "高价优先",\n                        "value": "searchlist_enjoy_sort_price_desc",\n                        "tab_selected": 1\n                    }\n                ],\n                "checked": 1,\n                "name": "高价优先",\n                "is_cancel_default_select": 1,\n                "tab_selected": 1,\n                "separator": "+",\n                "classify_item_type": "sort",\n                "params": "classify_v2_data",\n                "type": "group",\n                "is_no_btn": 1\n            }\n        ]\n    },\n    "retain_state": { //状态保持\n        "classify_business_type": "enjoy",   //筛选框业务类型\n        "classify_conf": "searchlist_classify_conf",   //筛选框配置\n        "classify_retain_level2": "", //上次选中的二筛(酒店联动,关联选中、取消、清除选中态)\n        "new_classify_cityadcode": "440100", //cityadcode 切城市后不保持(防止预期外的城市变动情况)\n        "new_classify_flag": "1", //新旧协议标记,1-新协议;2-旧协议  空-走行业和小流量判定\n        "level2_all": "[]" //动态的二筛数据(来自于querysug,非diamond)\n    }\n}
// TODO\npublic String getClassifyData(SearchClassifyInfo classify){\n\t// TODO\n}

备注:筛选数据有子分类时(如:西餐厅类型下有牛排、法国菜等子分类),筛选参数结果出现一系列category节点;当无子分类时(如:距离范围筛选数据)筛选参数结果出现value节点。


public class SearchRequest\n{\n    // 请求函数\n    public void doKeywordSearch()\n    {\n        // 1. 获取自车位所在经纬度\n        Coord2DDouble carPos = getCarLocation();\n        \n        // 2. 通过经纬度获取自车位所在城市编码\n        MapDataService mapDataService = getMapDataService(); // 获取地图数据服务,com.autonavi.gbl.data.MapDataService\n        int adCodeCarLoc =  mapDataService.getAdcodeByLonLat(carPos.lon, arPos.lat);\n        \n        // 3. 根据搜索场景计算搜索中心poiLoc以及搜索城市编码adCode\n        Coord2DDouble poiLoc;\n        int adCode;\n        switch (getSearchSceneType(1))\n        {\n            case SEARCH_SCENE_TYPE_ALONG_WAY:\n            {\n                /**< 沿途搜时以自车位为搜索中心点 */\n                poiLoc = carPos;\n                adCode = adCodeCarLoc;\n                break;\n            }\n            default:\n            {\n                // 获取当前地图中心点坐标\n                Coord2DDouble mapCenter = getMapCenter();\n                int adCodeMapCenter;\n                if (false == IsNetConnected) // 是否联网\n                {\n                    /**< 离线时从当前搜索城市信息中获取adcode,例如选择在北京市离线搜索 */\n                    adCodeMapCenter = getOfflineSearchAdcode();\n                }\n                else\n                {\n                    adCodeMapCenter = mapDataService.getAdcodeByLonLat(mapCenter.lon, mapCenter.lat);\n                }\n                \n                if ((adCodeCarLoc == adCodeMapCenter) || (adCodeMapCenter<0))\n                {\n                    /**< 自车位与图面中心点所在城市为同一城市或无法获取地图中心点adcode时, 框搜以自车位为搜索中心点 */\n                    poiLoc = carLoc;\n                    adCode = adCodeCarLoc\n                }\n                else\n                {\n                    /**< 自车位与图面中心点所在城市不为同一城市, 框搜以图面中心点为搜索中心点 */\n                    poiLoc = mapCenter;\n                    adCode = adCodeMapCenter;\n                }\n            }  \n        }\n        \n        // 4. 构建参数\n        KeywordSearchTQueryParam param;\n        param.keywords = "美食";  // 替换为输入框输入的搜索关键字\n        param.offlineParam.adcode = adcode;\n        param.city = adcode;\n        /* 搜索中心点坐标 */\n        param.poiLoc = poiLoc;\n        /* 自车位坐标 */\n        param.userLoc = carPos;\n        param.searchOperate = 1; // 框搜\n        /* 获取框搜范围,对角线两个点的坐标 */\n        param.geoObj = getGeoObj();\n        param.pageParam.Pagesize = 10;\n        param.offlineParam.resultMaxCount = 200;\n        \n        // TODO : 获取筛选参数\n        // param.classify_data = getClassifyData(SearchKeyWordObserver._classify);\n        \n        // 5. 回调观察者\n        SearchKeyWordObserver searchKeywordObserver = new SearchKeyWordObserver();\n        \n        // 6. 生成唯一的任务id\n        taskId = 1;\n        \n        // 发起关键字搜索\n        int iret = SearchServiceV2.KeyWordSearchTQuery(param, searchKeywordObserver, SEARCH_MODE_ONLINE_ADVANCED, taskId);\n    }\n}


","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-04-14 01:30:36","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":92,"collectCount":0,"estimateDate":48,"docStatus":0,"permissions":true,"overView":false}}