假设我有一个 FirstName > MiddleName > LastName 层次结构(为了这个问题,大约 10k 行)。这意味着您可以有“John > Mary-Anne > Eddy”或“Eddy > John > Jacob”行。关键是层次结构没有什么意义,而且对用户来说非常陌生(不像国家>州>城市结构)。
因为它是如此的非结构化和混乱,我想为用户提供一个自动完成的输入框。当他们键入时,它应该搜索可能的子字符串匹配,并且当他们在某个级别“root”他们的搜索字符串时,它会将结果限制在该级别以下。
现在,因为有很多人叫“约翰”,所以如果他们输入“约翰”,他们只会得到类似的结果,这没什么意义
- 约翰 > 艾伦 > 亚历山大
- 约翰 > 艾伦 > Burschawitz
- 约翰 > 艾伦……重复 100 次……
因为他们永远不会看到唯一的行“Jason > John > Smith”。
相反,他们应该得到类似的东西(“*”只是“嘿,下面还有很多行”的用户的一个任意指示符):
- 约翰 > 艾伦 > *
- 杰森 > 约翰 > 史密斯
- 迈克 > 约翰 > *
- 玛丽 > 埃琳娜 > 乔纳森
如果他们键入“John > Al”,则结果将仅限于“John >”下的任何内容,但应与上述类似地进行分组。
我希望解释清楚。要求有点松。只是合理的,这样人们就可以在树中搜索并找到他们想要的东西。
现在,我有一些有趣的 SQL 来查找行中的搜索词,找出它的位置,进行一些子字符串化、分组和排序以获得上述结果,但它的性能不够好。
我试图在典型的 LAMP 堆栈上解决这个问题(Oracle 除外)。它不是共享主机,所以我可以完全控制服务器。数据每隔几周就会发生少量变化,并且搜索结果可以在合理的时间内保持陈旧(例如,更新搜索索引的 cron 并非不可能)。