可以说我有一个名字>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%'

现在回想起来,这可能会更显而易见,如果数据都已经在邻接名单模型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top