Ruby on Rails - > ThinkingSphinx - > SphinxSearch - > Mysql
我想搜索titles表。预期的用户关键字不会完全匹配,这将是部分匹配。
search_key =android samsung galaxy ace black手机根据标题表搜索
titles(table) id | title
1 |诺基亚c6 2 |三星galaxy ace 3 | samsung galaxy ace y 4 |诺基亚Lumia 800 5 |三星蒙特 - 6 |三星Galaxy Note
case - 1:
> Title.search search_key,:match_mode => :全部 =>无结果评论:坏
情况-2:
Title.search search_key,:match_mode => :任何 => [$ s $ / pre $ $ b评论:好,但并不相关,用户只需要明确指定关键字中的samsung galaxy ace。为什么要显示其他三星手机?
$ bp $ p> Title.search'search_key / 3',:match_mode => :延长 => samsung galaxy ace
评论:Bingo !,但硬编码。 b 问题:
现在,我应该知道有多少个关键字会在标题表。 (例如,在android三星银河王牌黑手机中的三星银河王牌3)
我该如何解决这个问题?。狮身人面像处理这个?如果不是该做什么?
解决方案一种方法是将sphinx索引中的wordcount作为属性存储。
sql_field_str2wordcount是一个很好的方法来做到这一点 sphinxsearch/docs/current.html#conf-sql-field-str2wordcount
然后,您可以将其用作过滤器的基础。
$ cl-> setMatchMode(SPH_MATCH_EXTENDED); $ cl-> setRankingMode(SPH_RANK_WORDCOUNT); $ cl-> setSelect(*,IF(@ weight => titles,1,0)as myfilter); $ cl-> setFilter(myfilter,array(1)); $ cl->查询(\$ search_key \/ 1,标题);(对不起,不知道如何在思维上做到这一点-sphinx particully。以上是PHP API语法)
编辑,检查 freelancing-god.github/ts/en/searching.html 和 freelancing-god.github/ts/en/common_issues.html#or_attributes
看起来可能类似于
with_display =*,IF(@ weight => ;标题,1,0)AS显示 Title.search'search_key / 3',:match_mode => :extended,:rank_mode => :wordcount,:sphinx_select => with_display,:with => {'display'=> 1}
Ruby on Rails -> ThinkingSphinx -> SphinxSearch -> Mysql
I want to search the titles table. The expected user keyword will not be an exact match, it will be a partial match.
search_key = "android samsung galaxy ace black phones"Searching against the titles table,
titles(table)
id | titles1 | nokia c6 2 | samsung galaxy ace 3 | samsung galaxy ace y 4 | nokia lumia 800 5 | samsung monte 6 | samsung galaxy note
case - 1 :
Title.search search_key, :match_mode => :all =>No resultsComment: Bad
case -2 :
Title.search search_key, :match_mode => :any =>[samsung galaxy ace, samsung galaxy ace y, samsung monte, samsung galaxy note]Comment: OK, but not relevant, the user wanted only "samsung galaxy ace" which she specified in her keywords explicitly. Why show other samsung mobiles ?
case -3 :
Title.search 'search_key/3',:match_mode => :extended => samsung galaxy aceComment: Bingo!, but hard coded.
Question:Now, I should know how many number of keywords will get an exact match in the titles table. (For example, its 3 for "samsung galaxy ace" in "android samsung galaxy ace black phones")
How do I go around this?. Sphinx handles this?. If not what to do ?
解决方案One way is to store a wordcount in the sphinx index as attribute.
sql_field_str2wordcount is a good way to do this sphinxsearch/docs/current.html#conf-sql-field-str2wordcount
You can then use it as a basis of a filter
$cl->setMatchMode(SPH_MATCH_EXTENDED); $cl->setRankingMode(SPH_RANK_WORDCOUNT); $cl->setSelect("*,IF(@weight=>titles,1,0) as myfilter"); $cl->setFilter("myfilter",array(1)); $cl->Query("\"$search_key\"/1",'Title');(Sorry, dont know how to do this in thinking-sphinx particully. The above is the PHP API syntax)
Edit, checking freelancing-god.github/ts/en/searching.html and freelancing-god.github/ts/en/common_issues.html#or_attributes
looks like might be something like
with_display = "*, IF(@weight=>titles,1,0) AS display" Title.search 'search_key/3', :match_mode => :extended, :rank_mode => :wordcount, :sphinx_select => with_display, :with => {'display' => 1}
更多推荐
狮身人面像搜索部分关键字匹配
发布评论