标签: hierarchy

高性能分层文本搜索

我现在正处于升级主要交易系统中层次结构设计的最后阶段,我一直在这150行查询中盯着看(我将免除你阅读的所有单调)并认为那里必须是一个更好的方式.

该问题的快速摘要如下:

您将如何实现与层次结构中不同级别的多个搜索项匹配的分层搜索,并针对最快的搜索时间进行优化?


我发现了一个有点相关的问题,但它实际上只有我实际需要的答案的20%左右.这是完整的场景/规范:

  • 最终目标是在层次结构中的任意位置找到一个或多个任意项.
  • 完整的层次结构大约有80,000个节点,预计在几年内会增长到1M.
  • 层次结构中整个路径的全文是唯一且具有描述性的; 但是,单个节点的文本可能不是.这是一个商业现实,而不是一个轻率的决定.
  • 示例:一个节点可能有一个像"门"这样的名字,这本身就没有意义,但完整的背景,"Aaron> House> Living Room> Liquor Cabinet> Door",具有明确的含义,它描述了一个具体的特定门地点.(请注意,这只是一个例子,真正的设计远没那么简单)
  • 为了找到这个特定的门,用户可能会输入"aaron酒门",这可能只会产生一个结果.查询被翻译为序列:包含文本"door"的项目,在包含文本"liquor"的项目下,在包含文本"aaron"的另一项下.
  • 或者,用户可能只需键入"家酒"就可以列出人们家里的所有酒柜(不会那么好).我明确提到这个例子,表明搜索不需要匹配任何特定的根或叶级别.这个用户确切地知道他正在寻找哪个门,但不记得是谁拥有它,并且会记住这个名字是否出现在他面前.
  • 所有术语必须按指定的顺序匹配,但正如上面的示例所示,层次结构中的级别可以"跳过".术语"阿龙酒内阁"不会匹配这个节点.
  • 该平台是SQL Server 2008,但我认为这是一个独立于平台的问题,并且不希望限制该平台的答案.
  • 层次结构本身基于hierarchyid(物化路径),索引广度优先和深度优先.每个层次结构节点/记录都有一个Name要查询的列.基于节点的层次结构查询非常快,所以不要担心这些.
  • 没有严格的层次结构 - 根可能根本不包含任何节点,或者可能包含扇出到10,000个叶节点的30个子树.
  • 最大嵌套是任意的,但实际上它往往不超过4-8级.
  • 虽然不经常,但层次结构可以而且确实会发生变化.任何节点都可以移动到任何其他节点,但有明显的例外(父节点不能移动到自己的子节点等)
  • 如果还没有暗示:我确实可以控制设计,并可以添加索引,字段,表格,以及获得最佳结果所需的一切.

我的"梦想"是向用户提供即时反馈,如渐进式搜索/过滤器,但我知道这可能是不可能的或非常困难的.我对当前方法的任何重大改进感到满意,通常需要0.5s到1s,具体取决于结果的数量.

为了完整起见,现有查询(存储过程)首先收集包含最终项的所有叶节点,然后向上连接并排除其路径与先前项不匹配的任何路径.如果这对任何人来说都是落后的,那么请放心,它比从根源开始并散开更有效率.这是"旧的"方式,每次搜索可能需要几秒钟.

那么我的问题: 是否有更好(更有效)的方式来执行此搜索?

我不一定在寻找代码,只是方法.我考虑了一些可能性,但它们似乎都有一些问题:

  • 创建一个分隔的"路径文本"列,并使用全文搜索对其进行索引.麻烦的是,对此列的搜索也将返回所有子节点; "aaron house"也与"aaron house kitchen""aaron house basement"相匹配.
  • 创建一个NamePath实际上是嵌套字符串序列的列,使用CLR类型,类似于hierarchyid它自己.问题是,我不知道微软如何能够将这种类型的查询"转换"为索引操作,我甚至不确定是否可以在UDT上进行.如果最终结果只是一个完整的索引扫描,我通过这种方法得不到任何结果.

如果我不能做得比现有的更好,那真的不是世界末日; …

database performance search database-design hierarchy

8
推荐指数
1
解决办法
867
查看次数

Java Generics:使用List of subclass设置超类列表

如果我有一个方法MyClass,如

setSuperClassList(List<Superclass>)
Run Code Online (Sandbox Code Playgroud)

......我应该能够这样做:

new MyClass().setSuperClassList(new ArrayList<Subclass>())
Run Code Online (Sandbox Code Playgroud)

看来这不会编译.为什么?

java generics class hierarchy

8
推荐指数
2
解决办法
9824
查看次数

关于SQL Server HierarchyID深度优先性能的问题

我试图在一个表(dbo.[Message])中实现hierarchyID,其中包含大约50,000行(将来会大幅增长).但是,检索大约25个结果需要30-40秒.

根节点是填充符以便提供唯一性,因此每个后续行都是该虚拟行的子节点.

我需要能够遍历表深度优先并使hierarchyID列(dbo.[Message] .MessageID)成为集群主键,还添加了一个计算的smallint(dbo.[Message] .Hierarchy),它存储了节点的级别.

用法:.Net应用程序将hierarchyID值传递到数据库中,我希望能够检索该节点的所有(如果有)子节点和父节点(除根之外,因为它是填充程序).

我正在使用的查询的简化版本:

@MessageID hierarchyID   /* passed in from application */

SELECT 
m.MessageID, m.MessageComment 

FROM 
dbo.[Message] as m

WHERE 
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1

ORDER BY 
m.MessageID
Run Code Online (Sandbox Code Playgroud)

根据我的理解,应该在没有提示的情况下自动检测索引.

从搜索论坛我看到人们在处理广度优先索引时使用索引提示,但是在深度优先的情况下没有观察到这个应用程序.这对我的情景来说是一种相关的方法吗?

过去几天我一直试图找到解决这个问题的方法,但无济于事.我非常感谢任何帮助,因为这是我的第一篇文章,我提前道歉,如果这被认为是一个'noobish'问题,我已经阅读了MS文档并搜索了无数论坛,但没有看到简洁的描述具体问题.

sql t-sql hierarchy hierarchyid sql-server-2008

8
推荐指数
2
解决办法
5950
查看次数

SQL查询:分层合并

我有一个定义层次结构的表:

Create Table [example] (
    id          Integer   Not Null Primary Key,
    parentID    Integer       Null,
    largeData1  nVarChar(max) Null,
    largeData2  nVarChar(max) Null);
    -- largeData3...n also exist

Insert Into [example] (id, parentID, largeData1, largeData2)
Select 1, null, 'blah blah blah', null          Union
Select 2,    1, null,             null          Union
Select 3,    1, 'foo bar foobar', null          Union
Select 4,    3, null,             'lorem ipsum' Union
Select 5,    4, null,             null;
Run Code Online (Sandbox Code Playgroud)

此数据的层次结构图:

层次结构图

我想编写一个查询,它将返回任何给定[id]值的单行.该行应包含该行的[id]和[parentID]信息.它还应包含[largeData1 ... n]字段.但是,如果largeData字段为null,则它应该遍历层次结构,直到遇到该字段的非null值.简而言之,它应该像coalesce函数一样运行,除了行的层次结构而不是一组列.

例:

其中[id] = 1:

id:          1
parentID:    null
largeData1:  blah blah …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 coalesce hierarchy

8
推荐指数
1
解决办法
1073
查看次数

链接回wordpress中的主页

所以我将WordPress安装在我的网站的子目录中,并设置了永久链接.

我的网站设置如下:

-index.php
-style.css
-/contact
---index.php
-/blog
---(Wordpress installation)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,每当我使用 <a href="../">Home</a>链接回到我的主页时,它只能在我的主要博客页面上运行.如果我去固定链接帖子,它会带我回到博客主页.

我想知道的是,有没有办法链接到我的博客主页上的主页面和永久链接帖子?如果我使用../../它适用于帖子,但不适用于博客主页.

我希望我说得足够清楚,如果我遗漏了什么,请告诉我.任何帮助非常感谢,谢谢.

html wordpress hierarchy hyperlink file-structure

8
推荐指数
2
解决办法
3万
查看次数

定义层次结构查询中子项的排序顺序

我想知道通过sequence_within_parent列在层次结构查询中对子项进行排序的Oracle SQL查询.

示例数据集和查询是:

create table tasks (task_id                 number
                    ,parent_id               number
                    ,sequence_within_parent number
                    ,task                    varchar2(30)
                    );
insert into tasks values ( 1, NULL, 0, 'Task 1');
insert into tasks values ( 2,    1, 1, 'Task 1.1');
insert into tasks values ( 3,    1, 2, 'Task 1.2');
insert into tasks values ( 4,    2, 2, 'Task 1.1.2');
insert into tasks values ( 5,    3, 1, 'Task 1.2.1');
insert into tasks values ( 6,    2, 1, 'Task 1.1.1');
insert into tasks values ( …
Run Code Online (Sandbox Code Playgroud)

sql oracle hierarchy sql-order-by

8
推荐指数
1
解决办法
4009
查看次数

层次结构中子级别总和的总和

除了针对预算和修订预算列的该值本身设置的任何值之外,我还需要将每个级别设置为所有子级(在层次结构中)的总和.

我已经包含了我的表结构的简化版本和一些示例数据,以说明当前正在生产什么以及我想要生成什么.

样品表:

CREATE TABLE Item (ID INT, ParentItemID INT NULL, ItemNo nvarchar(10), ItemName nvarchar(max), Budget decimal(18, 4), RevisedBudget decimal(18, 4));
Run Code Online (Sandbox Code Playgroud)

样本数据:

INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (1, NULL, N'10.01', N'Master Bob', 0.00, 17.00);
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (2, 1, N'10.01.01', N'Bob 1', 0.00, 0.00);
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, Budget, RevisedBudget) VALUES (3, 2, N'10.01.02', N'Bob 2', 2.00, 2.00);
INSERT INTO Item (ID, ParentItemID, ItemNo, ItemName, …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server hierarchy common-table-expression sql-server-2008-r2

8
推荐指数
1
解决办法
8979
查看次数

如何在Android应用程序中进行视图层次结构转储

我想描述我的ui - 它落在onDraw方法的stackoverflow上

我被告知它因为我的ui有太多层次

我想做一个视图层次结构转储,看看我的图层有多深

但是当我尝试加载hierarchyviewer时,我收到此错误:

Error obtaining UI hierarchy
Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
Run Code Online (Sandbox Code Playgroud)

我如何解决它?

android hierarchy

8
推荐指数
1
解决办法
7097
查看次数

如何使用specs2对测试进行分组?

我已经习惯了JUnit,在JUnit中,只需在单个文件(类)中定义这些测试并使用它们进行注释,就可以将多个测试(通常与类相关)组合在一起@Test.然后,要运行其中几个测试,TestSuite使用@Suite.SuiteClasses依此类推创建a .

在specs2中,可以将两个不同级别的测试分组,扩展一些Specification.例如:

  "Whatever" should {
    "do its job when possible" in {
      whatever(new Thing).work must beSome
    }
    "return none when not possible" in {
      whatever(null).work must beNone
    }
  }
Run Code Online (Sandbox Code Playgroud)

我们可以Specification将这种类型中的几个组合在一个文件中,并且每个都可以打包几个检查,每个检查就像一个@Test,每个组像JUnit中的文件一样,然后每个都Specification作为SuiteJUnit中的一个,除了a Suite被分成几个类和a Specification在单个类(即文件)中,这往往会产生巨大的文件.

所以问题有两个:

  • 我应该把这些东西放在组织和可读性的问题上:a Specification和每个班级应该做的事情,即它应该通过的检查.
  • 如果整个测试组被分成几个文件,我怎样才能创建一个Suite如果可能的话以分层方式对它们进行分组,例如Suites对于ScalaTest.

BTW:我使用Specs2因为我觉得这是标准的(默认情况下是与原型,一个(非常小)小(传闻)样本证实了这一[ 1,2 ]),但我正在考虑使用ScalaTest.根据数字(specs2,scalatest)判断,这可能是遵循Scala社区标准和习俗的最佳选择.我之所以提到这一点是因为出于这些原因,"不可能使用ScalaTest"这样的答案是可以接受的.

unit-testing scala hierarchy specs2

8
推荐指数
1
解决办法
1330
查看次数

哪个更好的大查询或多个小查询?

哪个更好又有效?一个大的查询然后只是处理php中的获取查询或从php函数将只创建一个查询小数据的循环函数.请注意表格可以很大(数千个原始).谢谢.

评论表

id | parent | msg
---+--------+---------      
1  |   0    | hello   
2  |   1    | hi      
3  |   2    | whats up       
4  |   3    | yow       
5  |   1    | hellow   
6  |   2    | nice       
7  |   0    | great   
Run Code Online (Sandbox Code Playgroud)

预期产量是这样的:

        Array
        (
            [0] => Array
                (
                    [id] => 1
                    [parent] => 0
                    [value] => hello
                    [child] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [parent] => 1
                                    [value] => hi
                                    [child] => Array …
Run Code Online (Sandbox Code Playgroud)

php mysql arrays codeigniter hierarchy

8
推荐指数
1
解决办法
1万
查看次数