我想在我的网站上构建一个搜索功能,并通过最佳匹配来搜索结果。我正在使用postgres,并希望使用similarity()
来获得分数
为了获得最佳匹配,我使用regexp_matches()
现在一切都按预期工作,使用bind()
来降低sql注入的风险后,我得到的结果正如我所料。
我遇到的问题是括号,因为它们不会被转义,这会导致错误。
到目前为止我的代码:
$search = 'Some Query';
$query->find('active')
->select([
'Shops.id',
'Shops.name',
'score' => $query->newExpr()->add(
"similarity(Shops.name, :search)"
),
'regexp' => $query->newExpr()->add(
"regexp_matches(lower(Shops.name), lower(:search))"
),
])
->bind(':search', $search, 'string')
->contain([
'Currencies' => function (Query $q) {
return $q->find('active');
},
])
->order(['score' => 'DESC'])
->limit(ShopsTable::LIMIT_SEARCH);
有一个很好的做法可以保存查询吗?
注意:在此之前,我使用的crud查找操作会正确地转义搜索查询。
使用当前代码:
一些商店 - 工作
S'ome Shop - 工作
S“ome商店 - 工作
一些(商店 - 不工作
一些{商店 - 不工作