如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量

在Ubuntu的Scope,目前正在研发一个新的Filter的功能。我们可以在我们的开发者网站找到有关filter的更多的信息。在那里你可以看到一些关于filter的介绍,但是真正地入手去利用它还是有一定的难度的。今天在我们的例程中,我们来具体展示如何利用filter实现更好的搜索。在实际的应用中,比如我们可以通过filter来实现如下的ctrip的Scope:

   

在上面的中间的图中,我们可以看到“重庆”被选中了,在第二个列中,我们可以使用我们的department来进行从一个城市到另外一个城市的搜索。

首先,我们还是利用我们熟悉的点评Scope来作为练习。我们可以在我的先前的文章“在Ubuntu OS上创建一个department 点评Scope (Qt XML)”中下载我们的代码:

git clone https://gitcafe.com/ubuntu/dianpingdept.git

首先,我们在我们的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的设计工作。展示的图片在上面显示了。

所有的源码可以在地址下载:git clone https://gitcafe.com/ubuntu/dianping_filter.git

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 00:00:34

如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量的相关文章

如何在Ubuntu Scope中定义设置变量并读取

在本遍文章中,我们来讲解怎么对我们的Ubuntu Scope进行设置.对Scope而言,有些时候我们希望能够使用设置来改变我们的显示,或对我们的搜索进行重新定义.关于更多Scope的开发,请参阅网站:http://developer.ubuntu.com/scopes/ 1)首先创建一个最基本的Scope 我们首先打开SDK,并选择"Unity Scope"模版.我们选择一个项目的名称为"settingscope": 接下来,我们选择"Empty scop

利用video PreviewWidget在Ubuntu Scope中播放video

在先前的例程中,我们探讨了如何利用audio PreviewWidget在Scope中播放音乐.在这篇文章中,我们将介绍如何使用videoPreviewWidget来播放一个video. 我们首先来下载我在上一篇文章中的例程: git clone https://gitcafe.com/ubuntu/scopetemplates_audio.git 为了加入video PreviewWidget,我在我们的例程中加入了如下的句子: query.cpp r["videoSource"]

如何在Scope中利用keyword来使自己的Scope在聚合Scope中展示自己

在前面的文章"Scopes 关键词 (keyword)及departments探讨(英文视频)"中,我们已经对Scope中的keyword做了一些基本的介绍.但是我们没有相应的教程.在这篇文章中,我们将通过youku Scope来介绍如何使用keyword从而使得一个Scope在不同的聚合Scope中来得到不同的呈现. 如果大家对如何开发Scope还不是很熟的话,请参阅我的教程"在Ubuntu OS上创建一个dianping Scope (Qt JSON)".如果大

细细品味Ubuntu Scope中的category renderer模版

当我第一次接触Ubuntu Scope时,我发现这个Category Renderer太神奇.它可以把我们想要的数据很简单而直接的方式呈现给我们.但是由于资料的限制,我们很难知道它最终的显示的形式是什么样的.我们可以在我们的英文的网站的文章"Customization and branding"找到一下信息.但是总觉得意犹未尽,加之没有代码,有时很难理解它到底讲的是什么.在这篇文章中,我们来详细地介绍各种模版,并看看它们的显示格式.详细这对广大的开发者来说非常有用.我们可以修改这些模版

怎么在Ubuntu Scope中获取location地址信息

Location信息对很多有地址进行搜索的应用来说非常重要.比如对dianping这样的应用来说,我们可以通过地址来获取当前位置的一些信息.在这篇文章中,我们来介绍如何获取Scope架构中的位置信息.这个位置信息可以对我们很多的搜索是非常重要的. 1)创建一个简单的Scope应用 我们首先打开SDK,并选择"Unity Scope"模版: 接下来,我们选择"Empty scope".这样我们就创建了我们的一个最基本的scope了. 我们可以运行我们的Scope.这是

如何在Ubuntu手机中使用前置照相机

我们可以在Ubuntu QML的API文档中看到Camera的用法,但是里面没有写到任何的前置Camera的调用方法.对于一些应用来说,前置Camera的使用是重要的.我们必须使用Qt C++代码来实现这个功能.在这篇文章中,我们来介绍如何使用Ubuntu手机中的前置照相机. 1)创建一个最基本的QML应用         这样我们就生成了一个含有plugin的项目. 2)在项目中加入CameraSelector来选择照相机 为了能够调用Camera的一些API,我们在plugin中加入如下的C

手把手教你如何在Ubuntu系统中安装Pycharm

前几天带大家一起安装了Ubuntu14.04系统,没来得及上车的伙伴可以戳这篇文章:手把手教你在VMware虚拟机中安装Ubuntu14.04系统.今天小编带大家一起在Ubuntu14.04中安装Pycharm,具体的教程如下.1.首先在主目录下创建software文件夹,此时该文件夹为空文件夹.这个文件夹下用于放置安装软件,当然这个步骤不是必须的,只是小编习惯的做法. 2.去Pycharm官网上下载Pycharm的Linux安装包,建议下载专业版的,如下图所示. 3.下载到本地之后,将其用fi

利用reviews PreviewWidget在Ubuntu Scope中显示评价等级

我们可以利用reviews PreviewWidget来对我们的结果进行显示评价.比如对点评来说,如果是5星的评价,我们可以显示5个星表示客户对商品最高认可. 参阅我们的API的连接,我们可以看到如下的代码: { PreviewWidget w1("summary", "reviews"); w1.add_attribute_value("rating-icon-empty", Variant("file:///tmp/star-emp

利用gallery在Ubuntu Scope中显示多张图片

在这篇文章中,我们将介绍如何使用gallery PreviewWidget在Scope Preview中显示多幅图片.更多关于PreviewWidget类型可以参阅API. 首先,我们来下载我们上一节课里讲到的scopetemplate例程: git clone https://gitcafe.com/ubuntu/scopetemplates_video.git 为了能够显示多幅图片,我们对我们的程序做了如下的修改: query.cpp // add an array to show the