假设我有一个FirstName> MiddleName> LastName层次结构(~10k行,为了问题)。这意味着您可以拥有“John> Mary-Anne> Eddy”或“Eddy> John> Jacob”行。关键是层次结构没有意义,对用户来说非常陌生(不像国家>州>城市结构)。
因为它非常结构化和混乱,我想为用户提供一个自动完成输入框。在键入时,它应该搜索可能的子字符串匹配,当它们在一个级别“搜索”它们的搜索字符串时,它会将结果限制在该级别以下。
现在,因为有很多人名叫“约翰”,所以如果他们输入“约翰”,他们只会得到像
这样的结果,这是没有意义的。因为他们永远不会看到独特的行“Jason> John> Smith”。
相反,他们应该得到类似的东西(“*”只是一个任意指示给用户“嘿,这下面还有更多的行”):
如果他们输入“John> Al”,那么结果将仅限于“John>”下的任何内容,但应按上述方式进行分组。
我希望解释清楚。要求有点宽松。只是合理的,这样一个人就可以在树上搜索并找到他们所追求的东西。
现在,我有一些有趣的SQL,它在行中查找搜索词,找出它的位置,做一些子串,分组和按顺序来获得上述结果,但它的表现不够好
我正在尝试在典型的LAMP堆栈上解决此问题(Oracle除外)。它不是共享主机,所以我完全控制了服务器。数据每隔几周就会发生少量变化,搜索结果可能会在合理的时间内保持陈旧(例如,更新搜索索引的cron并非不可能)。
答案 0 :(得分:0)
哎呀。对不起,我无法描述我的问题。无论如何,这是我提出的解决方案。
基本上,从3列表创建第二个表,其中包含层次结构的每个连续级别的所有不同值,以及指示层次结构中该行深度的列。
E.g。从mytable(A, B, C)
开始,创建search_t(A, B, C, level)
因此,使用“One> Two> Three”,您可以创建3行(A,B,C,级别):
搜索时,您可以通过选择级别值并为上级列提供值来约束级别:
WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')
如果您创建search_str
列并执行LIKE
匹配,则可以稍微简化一些。
WHERE A='One' and level > 1 and search_str like '%t%'
回想起来,如果数据已经存在于邻接列表模型中,这可能会更加明显。