0

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

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

现在,因为有很多人叫“约翰”,所以如果他们输入“约翰”,他们只会得到类似的结果,这没什么意义

  • 约翰 > 艾伦 > 亚历山大
  • 约翰 > 艾伦 > Burschawitz
  • 约翰 > 艾伦……重复 100 次……

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

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

  • 约翰 > 艾伦 > *
  • 杰森 > 约翰 > 史密斯
  • 迈克 > 约翰 > *
  • 玛丽 > 埃琳娜 > 乔纳森

如果他们键入“John > Al”,则结果将仅限于“John >”下的任何内容,但应与上述类似地进行分组。

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

现在,我有一些有趣的 SQL 来查找行中的搜索词,找出它的位置,进行一些子字符串化、分组和排序以获得上述结果,但它的性能不够好。

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

4

1 回答 1

0

啊。抱歉,我无法描述我的问题。无论如何,这是我想出的解决方案。

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

例如从mytable(A, B, C),创建search_t(A, B, C, level)

因此,使用“一 > 二 > 三”,您可以创建 3 行(A、B、C、级别):

  • “一”,空,空,1
  • “一”,“二”,空,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%'

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

于 2009-04-09T03:02:51.600 回答