这是我的搜索请求:
(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 :(得分:0)
一个选项可以尝试expand_keywords
选项
http://sphinxsearch.com/docs/current.html#conf-expand-keywords
可能会提高搜索质量,因为具有精确形式匹配的文档的排名通常应高于带有词干或中缀匹配的文档。
唉它是一个索引级配置,而不是查询。然后可以从查询中删除*。
答案 1 :(得分:0)
我拥有的当前解决方案 - 使用和不使用通配符进行两次查询,然后将结果与顶部的完全匹配合并。它显然有效,但并不理想。