有效地搜索3级层次结构

时间:2009-04-08 03:06:41

标签: php oracle search hierarchy

假设我有一个FirstName> MiddleName> LastName层次结构(~10k行,为了问题)。这意味着您可以拥有“John> Mary-Anne> Eddy”或“Eddy> John> Jacob”行。关键是层次结构没有意义,对用户来说非常陌生(不像国家>州>城市结构)。

因为它非常结构化和混乱,我想为用户提供一个自动完成输入框。在键入时,它应该搜索可能的子字符串匹配,当它们在一个级别“搜索”它们的搜索字符串时,它会将结果限制在该级别以下。

现在,因为有很多人名叫“约翰”,所以如果他们输入“约翰”,他们只会得到像

这样的结果,这是没有意义的。
  • John>艾伦>亚历山大
  • John>艾伦> Burschawitz
  • John>艾伦......重复100次......

因为他们永远不会看到独特的行“Jason> John> Smith”。

相反,他们应该得到类似的东西(“*”只是一个任意指示给用户“嘿,这下面还有更多的行”):

  • John>艾伦> *
  • Jason>约翰>史密斯
  • 迈克>约翰> *
  • 玛丽> Elena> Johnason

如果他们输入“John> Al”,那么结果将仅限于“John>”下的任何内容,但应按上述方式进行分组。

我希望解释清楚。要求有点宽松。只是合理的,这样一个人就可以在树上搜索并找到他们所追求的东西。

现在,我有一些有趣的SQL,它在行中查找搜索词,找出它的位置,做一些子串,分组和按顺序来获得上述结果,但它的表现不够好

我正在尝试在典型的LAMP堆栈上解决此问题(Oracle除外)。它不是共享主机,所以我完全控制了服务器。数据每隔几周就会发生少量变化,搜索结果可能会在合理的时间内保持陈旧(例如,更新搜索索引的cron并非不可能)。

1 个答案:

答案 0 :(得分:0)

哎呀。对不起,我无法描述我的问题。无论如何,这是我提出的解决方案。

基本上,从3列表创建第二个表,其中包含层次结构的每个连续级别的所有不同值,以及指示层次结构中该行深度的列。

E.g。从mytable(A, B, C)开始,创建search_t(A, B, C, level)

因此,使用“One> Two> Three”,您可以创建3行(A,B,C,级别):

  • “One”,null,null,1
  • “One”,“Two”,null,2
  • “一个”,“两个”,“三个”,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%'

回想起来,如果数据已经存在于邻接列表模型中,这可能会更加明显。