【发布时间】:2009-04-08 03:06:40
【问题描述】:
假设我有一个 FirstName > MiddleName > LastName 层次结构(约 10k 行,为了这个问题)。这意味着您可以有“John > Mary-Anne > Eddy”或“Eddy > John > Jacob”行。关键是层次结构没有什么意义,而且对用户来说非常陌生(不像国家 > 州 > 城市结构)。
因为它是如此的非结构化和混乱,我想为用户提供一个自动完成的输入框。当他们键入时,它应该搜索可能的子字符串匹配,并且当他们在某个级别“root”他们的搜索字符串时,它会将结果限制在该级别以下。
现在,因为有很多人叫“John”,所以如果他们输入“John”,他们只会得到类似这样的结果是没有意义的
- 约翰 > 艾伦 > 亚历山大
- 约翰 > 艾伦 > Burschawitz
- John > Allen ... 重复 100 次 ...
因为他们永远不会看到唯一的行“Jason > John > Smith”。
相反,他们应该返回类似的东西(“*”只是“嘿,下面还有很多行”的用户的任意指示符):
- 约翰 > 艾伦 > *
- 杰森 > 约翰 > 史密斯
- 迈克 > 约翰 > *
- 玛丽 > 埃琳娜 > 乔纳森
如果他们键入“John > Al”,则结果将仅限于“John >”下的任何内容,但应按上述方式进行分组。
我希望解释清楚。要求有点松。只是合理的,这样人们就可以在树中搜索并找到他们想要的东西。
现在,我有一些有趣的 SQL,它在行中查找搜索词,计算出它的位置,进行一些子字符串化、分组和排序以获得上述结果,但它的性能不够好.
我正在尝试在典型的 LAMP 堆栈上解决这个问题(Oracle 除外)。它不是共享主机,所以我可以完全控制服务器。数据每隔几周会发生少量变化,搜索结果可能会在合理的时间内保持陈旧状态(例如,更新搜索索引的 cron 并非不可能)。
【问题讨论】:
-
我不得不说,我不明白你到底想做什么。不知道你能不能说的清楚一点。
-
嗯...也许是一个更好的类比:如果您有一个 url 列表,并且您搜索“com”,那么您不会想要 domain.com/a、domain.com/b、域名.com/b;你只想要“domain.com/”。之后的结果可能是“other.org/COMputers”
-
...您不想要 domain.com/a、/b、/c 的原因是它们太多了,以至于其他结果被推得太低以至于他们不会'没有出现在前 10 个结果中。
-
是您感兴趣的查询吗?
-
你的数据库结构是什么?这是一张带自动连接的表还是您有多个表?
标签: php oracle search hierarchy