如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量
2015-07-07 14:16
573 查看
在Ubuntu的Scope,目前正在研发一个新的Filter的功能。我们可以在我们的开发者网站找到有关filter的更多的信息。在那里你可以看到一些关于filter的介绍,但是真正地入手去利用它还是有一定的难度的。今天在我们的例程中,我们来具体展示如何利用filter实现更好的搜索。在实际的应用中,比如我们可以通过filter来实现如下的ctrip的Scope:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/d8a2358c756fd29da176171a1b33e022)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/18219f84a0c24f8994f28557035a531d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/52ce11547c49d8d0296523b4381128e5)
在上面的中间的图中,我们可以看到“重庆”被选中了,在第二个列中,我们可以使用我们的department来进行从一个城市到另外一个城市的搜索。
首先,我们还是利用我们熟悉的点评Scope来作为练习。我们可以在我的先前的文章“在Ubuntu OS上创建一个department 点评Scope (Qt XML)”中下载我们的代码:
https://github.com/liu-xiao-guo/dianpingdept
首先,我们在我们的SDK中,确保它是可以真确地运行的。在今天的练习中,我们想实现如下的Scope:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/3dbc7ca7d7c9eb4a2e2f5be48014cbd7)
`
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/909554a39e86ab1951ff168b622d8a83)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/155b6211a88707bffdf74d1dae3939c4)
我们在我们的设计中加入了一个filter。它可以用来选择我们显示搜寻结果的先后次序。这样在我们的department中就可以按照我们的选中来展示搜寻的结果。
首先,我们可以看看我们的点评API接口:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/4d55011fc80b24b451454200d0e091b6)
我们可以看见一个“sort”的项。在我们的API中,我们可以用来选中展示的结果的方式。
为了能够设计我们的filter,我们需要做如下的修改:
这个是一个helper方法用来初始化我们的filter所需要的数据。
我们通过上面的代码建立一个filter,同时,我们可以得到用户选择的filter的值,并存于成员变量m_pref中。
在上面的代码中,我们利用m_pref,并使之成为API请求的一部分。
这样我们就完成了我们的filter的设计工作。展示的图片在上面显示了。
所有的源码可以在地址下载:https://github.com/liu-xiao-guo/dianping_filter
在上面的中间的图中,我们可以看到“重庆”被选中了,在第二个列中,我们可以使用我们的department来进行从一个城市到另外一个城市的搜索。
首先,我们还是利用我们熟悉的点评Scope来作为练习。我们可以在我的先前的文章“在Ubuntu OS上创建一个department 点评Scope (Qt XML)”中下载我们的代码:
https://github.com/liu-xiao-guo/dianpingdept
首先,我们在我们的SDK中,确保它是可以真确地运行的。在今天的练习中,我们想实现如下的Scope:
`
我们在我们的设计中加入了一个filter。它可以用来选择我们显示搜寻结果的先后次序。这样在我们的department中就可以按照我们的选中来展示搜寻的结果。
首先,我们可以看看我们的点评API接口:
我们可以看见一个“sort”的项。在我们的API中,我们可以用来选中展示的结果的方式。
为了能够设计我们的filter,我们需要做如下的修改:
query.h
class Query: public unity::scopes::SearchQueryBase { public: Query(const unity::scopes::CannedQuery &query, const unity::scopes::SearchMetadata &metadata, QString const& scopeDir, QString const& cacheDir, api::Config::Ptr config); ~Query() = default; ... private: ... QMap<QString, QString> m_sortPref; QString m_pref; };
query.cpp
// This function is used to add filter support for my scope void Query::initFilerData() { m_sortPref["1"] = "默认"; m_sortPref["3"] = "产品评价高优先"; m_sortPref["2"] = "星级高优先"; m_sortPref["4"] = "环境评价高优先"; m_sortPref["5"] = "服务评价高优先"; m_sortPref["6"] = "点评数量多优先"; m_sortPref["7"] = "离传入经纬度坐标距离近优先"; m_sortPref["8"] = "人均价格低优先"; m_sortPref["9"] = "人均价格高优先"; }
这个是一个helper方法用来初始化我们的filter所需要的数据。
void Query::run(sc::SearchReplyProxy const& reply) { qDebug() << "Run is started .............................!"; // Initialize the scopes initScope(); ... initFilerData(); // set up the filter sc::Filters filters; const sc::CannedQuery &myquery(sc::SearchQueryBase::query()); sc::OptionSelectorFilter::SPtr prefFilter = sc::OptionSelectorFilter::create("category", m_sortPref[DEFAULT_PREF].toStdString()); prefFilter->set_display_hints(1); QMapIterator<QString, QString> i(m_sortPref); while (i.hasNext()) { i.next(); qDebug() << i.key() << ": " << i.value(); prefFilter->add_option(i.key().toStdString(), i.value().toStdString()); prefFilter->active_options(myquery.filter_state()); filters.push_back(prefFilter); } reply->push(filters, myquery.filter_state()); if (prefFilter->has_active_option(myquery.filter_state())){ auto o = *(prefFilter->active_options(myquery.filter_state()).begin()); m_pref = QString::fromStdString(o->id()); cerr << "pref id: " << o->id() << endl; cerr << "label: " << o->label() << endl; } else { cerr << "no active option!" << endl; m_pref = DEFAULT_PREF; } qDebug() << "m_pref: " << m_pref; ... }
我们通过上面的代码建立一个filter,同时,我们可以得到用户选择的filter的值,并存于成员变量m_pref中。
QString Query::getDeptUrl(QString dept) { QMap<QString, QString> map; map["category"] = dept; map["sort"] = m_pref; map["limit"] = QString::number(m_limit); map["platform"] = "2"; map["format"] = "xml"; qDebug() << "m_latitude: " << m_latitude; qDebug() << "m_longitude: " << m_longitude; map["latitude"] = m_latitude; map["longitude"] = m_longitude; return getUrl( BASE_URI, map ); }
在上面的代码中,我们利用m_pref,并使之成为API请求的一部分。
这样我们就完成了我们的filter的设计工作。展示的图片在上面显示了。
所有的源码可以在地址下载:https://github.com/liu-xiao-guo/dianping_filter
相关文章推荐
- Apache与Tomcat整合
- Linux目录结构及文件基本操作
- Linux语言环境设置
- centos6.5下源码安装mysql密码修改
- centos普通用户设置sudo权限
- Tomcat7 catalina.out 日志分割
- 【Scala】使用Option、Some、None,避免使用null
- FFmpeg + Opencv 解码和显示
- apache与tomcat负载集群的3种方法
- opencart2 添加水印图片
- SecureCRT连接Linux主机时,如何更改连接方式为xterm
- Linux Gparted创建NTFS分区,安装Windows系统时不识别的解决方案
- unix,mac下安装nginx
- tomcat与Apache整合(mod_jk)
- Linux系统下用户行为审计
- CentOS7中Docker文件挂载,容器中没有执行权限
- nginx解析php文件及问题
- LINUX下warning: cast from pointer to integer of different size问题
- NSOperation简单使用01
- netstat命令