我有一个包含4000万条记录的mysql表,这些记录由我无法控制的进程填充。数据每月只添加一次。此表需要可以通过“名称”列进行搜索。但名称列包含“Last First Middle”格式的全名。
在sphinx.conf中,我有
sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname,
substring_index(OwnersName,' ',2) as lastname
FROM table1
如何使用sphinx搜索按名字和/或姓氏搜索?我希望能够只用名字搜索'Smith'吗?
答案 0 :(得分:4)
SQL查询中的每行函数对于可能变大的表总是一个坏主意。如果要搜索列的一部分,则应将其提取到自己的列并编制索引。
我建议,如果你掌握了架构(而不是填充过程),则插入名为OwnersFirstName和OwnersLastName的新列以及更新/插入触发器,该触发器从OwnersName中提取相关信息并适当地填充新列
这意味着计算出名字的费用仅在更改行时完成,而不是每次运行查询。现在是时候做到这一点。
然后你的查询变得非常快。并且,是的,这打破了3NF,但是大多数人都没有意识到,出于性能原因可以做到这一点,只要你了解后果。而且,由于新列由触发器控制,因此引起关注的数据重复是“干净的”。
人们对数据库的大多数问题都是他们的查询速度。浪费一点磁盘空间来获得大量的性能提升通常是可以的。
如果你对模式完全没有没有的权力,另一种可能性是使用“正确”模式创建自己的数据库并定期从真实数据库填充它。然后查询你的。这可能涉及每个月相当多的数据传输,但是如果允许的话,第一个选项是更好的选择。
答案 1 :(得分:1)
根据其他答案判断,我可能错过了一些内容......但是要将Sphinx中的搜索限制为特定字段,请确保您使用的是扩展(或扩展2)匹配模式,然后使用以下查询string:@firstname Smith
。
答案 2 :(得分:0)
您可以使用子字符串来获取要搜索的字段部分,但这会降低进程的速度。查询不能使用任何类型的索引进行比较,因此必须触摸表中的每条记录。
最好不要在同一个字段中存储多个值,而是将名称组件放在三个单独的字段中。当您在字段中存储多个值时,访问数据几乎总是存在一些问题。我在不同的论坛上一遍又一遍地看到这一点......
答案 3 :(得分:0)
这是一个棘手的问题,因为fulll名称可以包含前缀,后缀,中间名和没有中间名,带有和不带连字符的复合名和姓,等等。没有合理的方法可以100%可靠地执行此操作