python - 假设我在数据库中有 400 行人名。搜索他们姓名的最佳方式是什么?

标签 python mysql database search indexing

他们还会搜索他们名字的一部分。不仅是带空格的单词。 如果他们输入“Matt”,我希望也能检索到“Matthew”。

最佳答案

SELECT * 
FROM mytable 
WHERE name LIKE 'matt%' OR name LIKE '[ ,-/]matt%'

注意事项:
1) 花哨的通配符。不使用更简单的 LIKE '%xyz%' 形式的原因是,根据 xyz,数据库可能返回许多不相关的记录。例如,搜索“Matt”时显示“Jeff Zermatt”。
第二个通配符键中的括号包括所有可以指示单词之间的分隔符的定界符。另一种通配符模式是 [^A-Z0-9](当搜索 brian 时可能会产生一些 O'Brian 但也许不是坏事...)

2) 性能。因为这个表的记录很少,所以前面通配符的做法是很可行的,当然也是最简单的做法。 没有理由进一步搜索!
如果记录碰巧很宽(很多字段,其中一些长度超过 30 个字符),您可以在 name 上创建索引。前端通配符仍然需要扫描,但这将位于更窄的索引上,因此更容易放入缓存等。
事实上,如果不是 SELECT * 这个查询只针对 myTable 表的几个字段[并且如果这个表的记录是“宽”],你可以创建一个由所有这些字段组成的索引。
如果记录数量超过 50,000(并且,在较小程度上,应用程序是否会以高于每分钟 40 条的速度“命中”数据库),您可以考虑引入更有效的处理方式关键字:全文目录或带有各个关键字的“手工制作”表格。

3) 另一种方法的优势。应用程序维护一个包含单个关键字列表的表的解决方案的优势,很容易从全名解析,不仅提供更好的缩放(当表和/或使用量增长时),而且还引入了改进搜索质量。
例如,它可以通过引入常见的方法来提高有效召回率 名字的常见昵称(William 的 Bill 或 Will 或 Billy,Richard 的 Dick,John 的 Jack 或 Johnny 等)。通过更复杂的方法打开的另一种可能性是引入名称标记的 Soundex 或修改后的 Soundex 编码,允许用户定位名称,即使他们可能拼错或忽略精确拼写(例如 Wilmson vs. Wilmsen vs. Willmsonn 等) .)

关于python - 假设我在数据库中有 400 行人名。搜索他们姓名的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394870/

相关文章:

python - 允许/阻止访问特定路径,apache 2.4 失败

mysql - 从sql中的两个表中选择COUNT查询

php - mysql:使用 SET 还是很多列?

android - 请为android中的本地数据库推荐任何库

php - 使用 PHP 创建多个 MySQL 数据库

php - 显示调度算法

python - CNN 过度拟合(附输出和代码)

python - 测试 post API 接收状态代码 200 而不是 201

python - 如何将 "with"与对象列表一起使用

mysql - 一个 `TEXT` 列可以容纳多少个多字节字符?