代码之家  ›  专栏  ›  技术社区  ›  Richard Levasseur

有效搜索三级层次结构

  •  0
  • Richard Levasseur  · 技术社区  · 15 年前

    假设我有一个firstname>middlename>firstname层次结构(考虑到这个问题,大约有10000行)。这意味着您可以使用“John>Mary Anne>Eddy”或“Eddy>John>Jacob”行。重点在于,层次结构没有什么意义,而且对用户来说非常陌生(不像,比如说,国家和城市结构)。

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

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

    • 约翰·艾伦·亚历山大
    • 约翰·艾伦·伯沙维茨
    • 约翰·艾伦…重复100次…

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

    相反,他们应该返回类似的内容(“*”只是对用户的一个任意指示器,“嘿,这里还有很多行”):

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

    如果他们键入“john>al”,则结果将仅限于“john>”下的任何内容,但应类似于上面的分组。

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

    现在,我有一些有趣的SQL来查找行中的搜索项,找出它的位置,做一些子字符串、分组依据和排序依据来得到上面的结果,但是它的性能不够好。

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

    1 回复  |  直到 15 年前
        1
  •  0
  •   Richard Levasseur    15 年前

    哎呀。抱歉,我无法描述我的问题。不管怎样,这就是我提出的解决方案。

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

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

    因此,使用“一、二、三”,可以创建三行(A、B、C、Level):

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

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