这是我的搜索请求:在狮身人面像中使用通配符时如何提高精确匹配结果的相关性?
(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特定包装,虽然我不认为这很重要。
我有这个选项启用。我尝试删除通配符,但只返回完全匹配(“学校4”,没有“学校42”)。禁用此选项对结果集没有明显影响。 –
更改选项时是否重建索引? – barryhunter
当然可以。 –