【问题标题】:rails sunspot solr search by keywordsrails sunspot solr 按关键字搜索
【发布时间】:2013-09-16 03:50:14
【问题描述】:

我正在搜索 2 天以使用 sunspot solr 查询关键字搜索。看不懂

我的预期输出是

如果我搜索laptops in US,它应该搜索笔记本电脑和我们

但下面的代码只搜索笔记本电脑而不搜索其他词。我怎样才能实现它。

我的全文运行良好

我已经编辑了schema.xml

<fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
      </analyzer>

      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StandardFilterFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>

我的模型包含

searchable do
        text :title,:description,stored: true
        time :updated_at
        text :product do
            product.name if product
        end
        text :product_model do
            product_model.name if product_model
        end
    end

我的控制器是

@search = Post.search do
      fulltext params[:search] do
        query_phrase_slop 1
      end
    end

编辑 1

我有两行 pizza 在一列中,post 在另一列中。如果我搜索 pizza 它会返回 5 个结果,如果我搜索 post 它会返回 1 个结果。最后,如果我搜索pizza post,则结果为空。但预期的输出是得到 6 个结果。

我把fulltext params[:search] do改成了keywords params[:search] do

编辑 2

def index
    @search = Post.search do
      fulltext params[:search].split(' ') do
        phrase_slop 1
      end
    end
    @posts = @search.results
end

【问题讨论】:

  • 'us' 可能在停用词列表中,尽管没有明确包括 StopFilterFactory,但它似乎被排除在外,也许尝试在其中添加 KeepWordFilterFactoryus?另外,您可以尝试将NGramFilter 更改为ShingleFilter,它可能会产生更好的结果,这里`re 文档供参考:wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
  • 搜索不限于us单独computer with rate of $2500这个语句应该搜索计算机和$2500
  • @zrl3dx 你能看看我的edit 1
  • 好的,我已经在本地测试过了,你可以测试以下设置:fulltext params[:search].split(' ') 吗?
  • 天啊,我错过了在我的配置中添加的明显选项 - 我觉得我太累了 ;) 我保证,这是最后的改变,如果仍然没有帮助,我投降.您可以保留所有选项,但在 query_phrase_slop 旁边添加 minimum_match 1。这是合乎逻辑的,即使在源代码中也清楚地写着,如果没有提供值,则所有术语都必须匹配,呵呵。

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


【解决方案1】:

最后,我们发现了问题所在(cmets),但我会将其作为答案,因此问题可能会像已回答的那样结束。

您应该将minimum_match 添加到您的search 块中,即:

@search = Post.search do
      fulltext params[:search] do
        query_phrase_slop 1
        minimum_match 1
      end
    end

如果未提供该选项,则默认为“所有术语匹配”(source)。

【讨论】:

  • 不敢相信我花了 4 个小时寻找这个...这应该在文档中(关于 query_phrase_slop,作为警告)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2013-09-19
相关资源
最近更新 更多