gpt4 book ai didi

mysql喜欢匹配字符串上的完整单词或单词开头

转载 作者:可可西里 更新时间:2023-11-01 07:37:17 24 4
gpt4 key购买 nike

给定一个搜索字符串,我需要选择每条记录,其中(在执行搜索的字段中)至少有一个以给定文本开头的单词。

例如:

'John Doe'

必须使用如下搜索字符串进行选择:

'joh'
'do'
'JOHN doe'

没有被选中

'ohn'
'oe'

我需要(可能)避免全文搜索。

我发现的工作是

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

我在问是否有更好的方法。

(对于“更好的方式”,我的意思是更好的性能相同的性能但更优雅)

此外,由于查询将使用准备好的语句构建,我应该如何取消搜索字符串中的 LIKE 元字符?

最佳答案

如问题中所述查询

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
. 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

适用于匹配 SEARCHFIELD 包含以(或等于)$searchText 开头的单词的记录


关于性能,我在我的开发机器 MBP 2,2 GHz i7 四核 上进行了测试:

在 4000 条记录中搜索一个词大约需要 40 毫秒。

记录通常有索引(无全文)。

我有几千条记录,查询不经常运行,所以对我来说很好。
该解决方案可能不适用于其他情况。


为了使用上述查询构建准备好的语句,我使用了此处描述的技术:

Escaping MySQL wild cards

结果代码如下:

function like($s, $e)
{
return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}

/* ... */

/* create a prepared statement */
$stmt = $mysqli->prepare(
'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
);

if( $stmt )
{
/* escape the text */
$escSearchText = like( $searchText, "=" );

/* 'like' parameters */
$like1 = $escSearchText . "%";
$like2 = "%" . $escSearchText . "%";

/* bind parameters for markers */
$stmt->bind_param( "ss", $like1, $like2 );

/* ... */

关于mysql喜欢匹配字符串上的完整单词或单词开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19717713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com