【问题标题】:sunspot-solr: How to exclude search results that include any given word?sunspot-solr:如何排除包含任何给定单词的搜索结果?
【发布时间】:2012-11-25 02:55:33
【问题描述】:

我有一个使用 solr 的 Ruby on Rails 应用程序。我为此使用太阳黑子宝石。我也将 websolr 用于生产环境。

我知道我们可以使用 sunspot solr 进行全文搜索。但我也希望能够排除具有给定单词的任何命中(以及最终结果)。

示例类:

class Article
    searchable do
        text :title
        text :content
    end
end

现在,我想搜索其内容中包含 "Obama" 的文章,但也想排除 包含单词 "Lady 的文章嘎嘎”。我知道我可以对返回的结果数组应用拒绝块,但我想在 Solr 级别处理这种情况。

希望我能清楚地说明我的问题。

提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby solr sunspot-solr websolr


    【解决方案1】:

    来自https://github.com/sunspot/sunspot/wiki/Fulltext-search

    解析正常布尔查询语法的一小部分:特别是,匹配良好的引号可用于划分短语,+ 和 - 运算符可用于分别要求或排除单词 em>

    这就是你要找的吗?

    【讨论】:

    • 这似乎是解决方案,但你能举个例子吗?我无法使用全文“Obama”-“Lady Gaga”或全文“Obama -Lady Gaga”。
    • 嗯,特别是我试过Job.search { keywords "java -'software engineer'" },它似乎在我们的应用程序上工作。
    【解决方案2】:

    我会使用 adjust_solr_params 来使用带有否定子句的 edismax。

    Article.search do
      fulltext params[:q]
      adjust_solr_params do |solr|
        solr['defType'] = 'edismax'
        solr['q'] += %( -"some phrase to exclude")
      end
    end
    

    不是最明显的方法,当然没有记录,并且我没有测试过它,但它应该可以工作。希望未来版本的 Sunspot 能够更原生地支持 edismax。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多