代码之家  ›  专栏  ›  技术社区  ›  joshweir Raveena

使用ThinkingSphinx,如何查询最小和最大权重

  •  0
  • joshweir Raveena  · 技术社区  · 8 年前

    min(weight()) max(weight()) 使用 ThinkingSphinx . 我试过这个:

    results = Work.search(
                'example', :ranker => "expr('sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25*20')",
                :select => 'min(weight()) as min_weight, max(weight()) as max_weight')
    results.context[:panes] << ThinkingSphinx::Panes::WeightPane
    

    SELECT min(weight()) as min_weight, max(weight()) as max_weight 
    FROM `work` 
    WHERE MATCH('example') 
    LIMIT 0, 20 
    OPTION ranker=expr('sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25*20')
    

    如果我直接对sphinx运行上面的sphinx表达式,它会工作,但是 Work.search 呼叫错误:

    undefined method `constantize' for nil:NilClass
    

    查看代码库后,我发现错误与没有 sphinx_internal_class :select 子句,并且进一步,我现在理解这将是一个问题,因为ThinkingSphinx想要查询 ActiveRecord

    活动记录 在斯芬克斯询问之后?

    1 回复  |  直到 8 年前
        1
  •  1
  •   joshweir Raveena    8 年前

    正如所指出的那样 here :

    执行标准的TS搜索,但使用原始中间件集(其中

    results = Model.search ‘foo’, :middleware =>
                  ThinkingSphinx::Middlewares::RAW_ONLY
    

    所以换成这个给了我原始的结果:

    results = Work.search(
            'example', :ranker => "expr('sum((4*lcs+2*(min_hit_pos==1)+exact_hit)*user_weight)*1000+bm25*20')",
            :select => 'min(weight()) as min_weight, max(weight()) as max_weight'),
            :middleware => ThinkingSphinx::Middlewares::RAW_ONLY