2017-07-03 118 views
0

这是我的搜索请求:在狮身人面像中使用通配符时如何提高精确匹配结果的相关性?

(new SphinxSearch()) 
     ->search((new SphinxClient())->escapeString($query) . '*', 'services') 
     ->setMatchMode(SphinxClient::SPH_MATCH_EXTENDED) 
     ->setFieldWeights([ 
      'name' => 10, 
      'legal_name' => 10, 
      'description' => 10, 
      'keywords' => 10, 
      'category_name' => 3, 
      'categories' => 3, 
     ]) 
     ->setSortMode(SphinxClient::SPH_SORT_EXTENDED, "@weight DESC") 
     ->setRankingMode(SphinxClient::SPH_RANK_SPH04) 
     ->get(true); 

这里是指数的配置:

index services 
{ 
    source = services 
    path = /var/lib/sphinxsearch/data/services 
    docinfo = extern 
    morphology = stem_enru 
    min_stemming_len = 1 
    min_word_len = 1 
    min_infix_len = 1 
    html_strip = 1 
    index_exact_words = 1 
    expand_keywords = 1 
    mlock = 0 
    charset_table = 0..9, A..Z->a..z, _, *, -, a..z, \ 
         U+2C->U+2E, U+2E, U+0044, U+0046, U+0130, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F 
} 

对于查询“学校№4”将返回所有相关结果,但类似“学校№42“在顶部和”学校№4“的确切比赛接近结果集的底部。
嗯,它实际上并不是一个确切匹配 - 在服务名称中可能有一些其他的词和符号。但它最接近用户在搜索字段中输入的内容,所以我认为它应该比使用通配符的结果更相关。

如何将“精确”匹配移动到集合的顶部?

P.S.我正在使用this Laravel的SphinxClient特定包装,虽然我不认为这很重要。

回答

0

办法之一,试试expand_keywords选项 http://sphinxsearch.com/docs/current.html#conf-expand-keywords

都不可能改善搜索质量,具有精确的形式匹配的文件应该比茎或缀匹配的文档的排名普遍较高。

唉这是一个索引级配置,而不是查询。然后可以从查询中删除*。

+0

我有这个选项启用。我尝试删除通配符,但只返回完全匹配(“学校4”,没有“学校42”)。禁用此选项对结果集没有明显影响。 –

+0

更改选项时是否重建索引? – barryhunter

+0

当然可以。 –

0

我现有的解决方案 - 使用和不使用通配符进行两个查询,然后将结果与顶部的精确匹配进行合并。它工作,但显然不理想。

相关问题