题
可以说我有一个名字>MiddleName>LastName层次(~10公里的行为的问题)。这意味着你可以有"约翰>Mary-Anne>涡"或"涡>约翰>雅各布"排。这点正在得层次结构意义和非常外的用户(不同,也就是说,一个国家>国家>的城市结构)。
因为它以非结构化和困惑,我要向用户提供一个自动完成的输入箱。因为他们的类型,它应该寻找可能的substring相匹配,而当他们的"根"他们的搜索字符串在一个水平,然后,它会限制的结果下面这一水平。
现在,因为有大量的人命名"约翰",这是毫无意义的,如果他们型"约翰"他们只能找回的结果喜欢
- 约翰>艾伦>亚历山大
- 约翰>艾伦>Burschawitz
- 约翰>艾伦...重复的100倍...
因为他们将永远见不到的唯一行"杰森>约翰>Smith"。
相反,他们应该得到回喜欢的东西("*"只是一个任意的指标,以用户"嘿,大量更多的行下面这一存在"):
- 约翰>艾伦>*
- 杰森>约翰>史密斯
- 迈克>约翰>*
- 玛丽>埃琳娜>Johnason
如果他们型"约翰>Al",那么结果将是有限的,任何根据"约翰>",而应归类似于以上。
我希望解释是明确的。要求是一点点宽松。只是合理的,以使一个人可以搜索过树和找到他们之后。
现在,我有一些有趣的SQL,看起来搜索词在排,找出它的位置,并有一些子串'ing、集团车处,并以通过的获得上述结果,但它不执行不够好。
我在试图解决这个问题上的一个典型的灯堆(除了与Oracle).它不是共同主办的,所以我没有完全控制服务器。数据变化很小的数额,每隔几个星期,并将搜索结果可以留陈旧的一个合理的时间(e。g,定时更新的搜索引不了的问题)。
解决方案
哎呀.对不起我不能描述我的问题。不管怎么说,这里的解决方案,我来了。
基本上,创建一个二表3列表,包含了所有的独特价值,对每个连续的水平的层次结构,以及一个列指示的深度,排的层次。
E.g。从 mytable(A, B, C)
, 创建 search_t(A, B, C, level)
因此,与"一个>两>三个"你创造3排(A,B,C,平):
- "One",null,null,1
- "One","Two",null,2
- "One","Two","Three",3
搜索时,可以约束水平,选择一个价值水平和提供价值为上级列:
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%'
现在回想起来,这可能会更显而易见,如果数据都已经在邻接名单模型。