【问题标题】:Efficiently searching a 3-level hierarchy高效搜索 3 级层次结构
【发布时间】:2009-04-08 03:06:40
【问题描述】:

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

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

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

  • 约翰 > 艾伦 > 亚历山大
  • 约翰 > 艾伦 > Burschawitz
  • John > Allen ... 重复 100 次 ...

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

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

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

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

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

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

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

【问题讨论】:

  • 我不得不说,我不明白你到底想做什么。不知道你能不能说的清楚一点。
  • 嗯...也许是一个更好的类比:如果您有一个 url 列表,并且您搜索“com”,那么您不会想要 domain.com/a、domain.com/b、域名.com/b;你只想要“domain.com/”。之后的结果可能是“other.org/COMputers”
  • ...您不想要 domain.com/a、/b、/c 的原因是它们太多了,以至于其他结果被推得太低以至于他们不会'没有出现在前 10 个结果中。
  • 是您感兴趣的查询吗?
  • 你的数据库结构是什么?这是一张带自动连接的表还是您有多个表?

标签: php oracle search hierarchy


【解决方案1】:

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

基本上,从包含层次结构每个连续级别的所有不同值的 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%'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2022-01-06
    • 1970-01-01
    • 2014-07-23
    • 2011-05-26
    • 2012-10-26
    • 2011-05-19
    相关资源
    最近更新 更多