{"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}