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

时间:2010-03-07 01:54:55

标签: python mysql database search indexing

他们还会搜索他们名字的一部分。不仅是带空格的单词。 如果他们输入“马特”,我希望也能找回“马修”。

4 个答案:

答案 0 :(得分:12)

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

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

2)性能。由于此表中的记录太少,因此前面的通配符方法非常可行,当然也是最简单的方法。 没有理由继续搜索!
如果记录非常广泛(许多字段中的一些字段长度超过30个字符),则可以在name上创建索引。前端通配符仍然需要扫描,但这将在较窄的索引上,因此更容易适应缓存等。
实际上,如果这个查询只针对myTable表中的几个字段[并且如果该表的记录是“宽”]而不是SELECT *,那么您可以创建一个由所有这些字段组成的索引。
记录的数量是否会超过50,000(并且,在较小程度上,应用程序会以高于每分钟40次的速率使用类似查询“点击”数据库),您可以考虑引入更有效的处理方式关键字:全文目录或带有各个关键字的“手工制作”表。

3)另一种方法的优点。应用程序维护一个表,其中包含从全名中轻松解析的各个关键字列表的解决方案的优点,不仅提供了更好的扩展(当表和/或使用增长时),而且还引入了改进搜索的质量。
例如,它可以通过引入共同点来改善有效召回 常用的名字昵称(比尔或威尔或比利为威廉,迪克为理查德,杰克或约翰尼为约翰等)。通过更复杂的方法开辟的另一种可能性是引入Soundex或修改名称标记的Soundex编码,允许用户定位名称,即使它们可能错误拼写或忽略精确拼写(例如Wilmson vs. Wilmsen vs. Willmsonn等。)

答案 1 :(得分:10)

您可以使用:

SELECT * 
 FROM mytable 
WHERE name LIKE '%matt%'

答案 2 :(得分:1)

您有以下选择:

  1. Full Text Search(FTS)
  2. Regular Expressions
  3. LIKE使用通配符
  4. ......按照优先顺序排列。

答案 3 :(得分:0)

如果您尝试通过任何开发语言搜索名称,则可以使用Java中的正则表达式包。 像java.util.regex。*;

这样的东西