BOOLEAN 和 LIKE 与 Yii2 一起搜索?
BOOLEAN and LIKE search together with Yii2?
我使用 YII2 Framework 并且我在 BOOLEAN MODE 中构建了这个搜索:
if( $campi[$i] == "PossessoreElenco" ){
if(strpos($valor[$i], ' OR ') !== false) {
$titOR = str_replace(" OR ", ' ', $valor[$i]);
$query.= 'MATCH(PossessoreElenco) AGAINST("'.$titOR.'" IN BOOLEAN MODE)'; }
现在,如果我写“Marc*”,结果会同时显示:“Marco”、“San Marco”。这是对的,但不是我想要的结果。我只接受以我写的单词开头的结果。所以,最后,如果我在布尔模式下写 Marc* OR Mich*,我想搜索以“Marc”或“Mich”(例如 'Marco' 或 'Michele')开头的结果,而不是所有包含单词的结果(例如,我不想要 'San Marco')。有机会实现这个选项来维护布尔搜索吗?
我可以使用 LIKE 'Marc%',但在这个解决方案中我失去了布尔搜索。
感谢您的帮助!
布尔全文搜索基于单词,不关心字符串的开头..
如果你需要这个,你可以强制查询添加一个有条款来过滤结果行
WHERE MATCH(PossessoreElenco) AGAINST( ? IN BOOLEAN MODE)
HAVING PossessoreElenco LIKE caoncat(?,'%')
注意在没有聚合函数的情况下使用having子句过滤结果是非常不合适的
因此您可以将主查询用作子查询来应用 eforcemnet
select *
from (
SELECT
....
WHERE MATCH(PossessoreElenco) AGAINST( :my_word IN BOOLEAN MODE)
) T
WHERE T.PossessoreElenco LIKE concat(:my_word,'%')
你应该避免在 sql 中使用 php var 因为这会产生 sqlijcetion 为了避免 tgis 你可以使用命名参数并使用 Yii2 提供的相关绑定功能
我使用 YII2 Framework 并且我在 BOOLEAN MODE 中构建了这个搜索:
if( $campi[$i] == "PossessoreElenco" ){
if(strpos($valor[$i], ' OR ') !== false) {
$titOR = str_replace(" OR ", ' ', $valor[$i]);
$query.= 'MATCH(PossessoreElenco) AGAINST("'.$titOR.'" IN BOOLEAN MODE)'; }
现在,如果我写“Marc*”,结果会同时显示:“Marco”、“San Marco”。这是对的,但不是我想要的结果。我只接受以我写的单词开头的结果。所以,最后,如果我在布尔模式下写 Marc* OR Mich*,我想搜索以“Marc”或“Mich”(例如 'Marco' 或 'Michele')开头的结果,而不是所有包含单词的结果(例如,我不想要 'San Marco')。有机会实现这个选项来维护布尔搜索吗? 我可以使用 LIKE 'Marc%',但在这个解决方案中我失去了布尔搜索。 感谢您的帮助!
布尔全文搜索基于单词,不关心字符串的开头.. 如果你需要这个,你可以强制查询添加一个有条款来过滤结果行
WHERE MATCH(PossessoreElenco) AGAINST( ? IN BOOLEAN MODE)
HAVING PossessoreElenco LIKE caoncat(?,'%')
注意在没有聚合函数的情况下使用having子句过滤结果是非常不合适的
因此您可以将主查询用作子查询来应用 eforcemnet
select *
from (
SELECT
....
WHERE MATCH(PossessoreElenco) AGAINST( :my_word IN BOOLEAN MODE)
) T
WHERE T.PossessoreElenco LIKE concat(:my_word,'%')
你应该避免在 sql 中使用 php var 因为这会产生 sqlijcetion 为了避免 tgis 你可以使用命名参数并使用 Yii2 提供的相关绑定功能