在使用 Xunsearch
进行搜索时,我们可以通过 XSSearch::addWeight
针对某个字段添加权重索引词。该字段是否包含这个词 都不影响搜索匹配结果,但如果包含会参与计算结果权重,使结果的相关度更高。常用于针对某一类 数据提升搜索结果排序位置。
如搜索包含 "杭州" 的结果,并且提升 subject 字段包含 "西湖" 的数据的排序
$docs = $search->setFuzzy()->setQuery('杭州')->addWeight('subject', '西湖')->search();
注意
- 这些修饰不能应用到快捷搜索中,也就是说不能直接把 Query 语句传递给
XSSearch::search
。 您必须用XSSearch::setQuery
设置搜索语句,再用不带参数的调用search
或count
方法。 - 区间搜索默认用的是字节序比较,如果您希望将字段值以数字方式比较大小,请将字段的类型设置为
numeric
。
添加权重后导致搜索不再进行模糊搜索问题
在 上面语句中我们可以使用 setFuzzy()
方法开启模糊搜索, 但 addWeight
方法有个bug,其将搜索模式强制改为 AND 规则的非模糊搜索形式,导致搜索结果不准确。
此处可以修改 addWeight
方法进行修复
/**
* 添加权重索引词
* 无论是否包含这种词都不影响搜索匹配, 但会参与计算结果权重, 使结果的相关度更高
* @param string $field 索引词所属的字段
* @param string|array $term 索引词
* @param float $weight 权重计算缩放比例
* @return XSSearch 返回对象本身以支持串接操作
* @see addQueryTerm
*/
public function addWeight($field, $term, $weight = 1)
{
# 此处将写死的 XS_CMD_QUERY_OP_AND_MAYBE 改为 $this->_defaultOp 即可
return $this->addQueryTerm($field, $term, $this->_defaultOp, $weight);
}
标签:加权,search,权重,xunsearch,addWeight,索引,搜索,XSSearch
From: https://blog.51cto.com/sdwml/7343651