SOLR中倒排索引的数据结构究竟是什么样的

时间:2015-11-26 01:50:06

标签: apache solr lucene inverted-index

全部,请原谅我,我刚刚开始学习如何使用SOLR。强大的SE。 我已经知道Inverted IndexSOLR中搜索速度如此之快的原因Solr in action。在许多阅读。与Apache Solr search patternDocument一样。倒转索引如下所述。

enter image description here

我也知道Fieldsmodule enter_password( input wire clk, reset, input wire ps2d, ps2c, rx_en, output wire [6:0] seven_seg_display, output wire assert_seg); wire [7:0] scan_out; wire [7:0] ascii_code; //initial seven_seg_display = 7'b0000000; assign assert_seg = 1'b1; // instantiate ps2 receiver ps2_rx ps2_rx_unit( .clk(clk), .reset(reset), .rx_en(1'b1), .ps2d(ps2d), .ps2c(ps2c), .rx_done_tick(scan_done_tick), .dout(scan_out)); // instantiate key-to-ascii code conversion circuit Scan_to_ascii key2ascii(.key_code(scan_out), .ascii_code(ascii_code)); assign seven_seg_display = ascii_code == 8'h30 ? 7'b0000001: //0 ascii_code == 8'h31 ? 7'b1001111: //1 ascii_code == 8'h32 ? 7'b0010010: //2 ascii_code == 8'h33 ? 7'b0000110: //3 ascii_code == 8'h34 ? 7'b1001100: //4 ascii_code == 8'h35 ? 7'b0100100: //5 ascii_code == 8'h36 ? 7'b0100000: //6 ascii_code == 8'h37 ? 7'b0001111: //7 ascii_code == 8'h38 ? 7'b0000000: //8 ascii_code == 8'h39 ? 7'b0000100: //9 7'b1111111; //e for error 0 endmodule 组成。 在我对上述数据结构的理解中。使用像“哈利”这样的特定术语进行搜索时。 SE将返回结果文档1,2。我毫不怀疑。

但是当我读到guide from apache时。它说

  

分析在两种情况下进行。在索引时,当一个字段是   正在创建,添加分析产生的令牌流   索引并定义术语集(包括位置,大小和   等等)对于该领域。在查询时,搜索的值是   分析并将结果与​​那些相匹配的术语进行匹配   存储在字段的索引中。

我对此阅读感到困惑。

倒排索引是否指向文档或字段? 在我提到的图中。它没有提到任何关于领域的事情。它只是说索引指向文档ID。 但在阅读中我引用了。它确实告诉我们倒排索引指向不是文档的字段。 (如果我错了。请纠正我。) 感谢。

4 个答案:

答案 0 :(得分:2)

我理解你的困惑,这是文献解释手头主题过度简化的案例之一。大多数文献使用仅仅是文本的文档来解释和反向索引,因此(如图所示)一个文档只是一个字符序列,而没有其他字段"存在。

当您解释反向索引是什么时,这很有用,但是当您与实际实现(如Lucene / ES / Solr提供的实现)交互时,实际情况会有所不同。

也许this post可能有用,如果你一直走下去,阅读会有点密集,但是如果你只是想要掌握要领并且不要试图理解一切中的一切。作为建议,Lucene实现包含更多技术细节,例如,以确保性能和减少磁盘使用。

底线是,基本上每个字段都像一个"迷你倒排索引"本身,并允许知道在哪个特定的"部分/字段"您的文档与您的查询匹配发生,因此您可以相应地影响您的分数(通常是如何订购结果)。如果你总是有平面文件,搜索引擎就不会那么有用了。

答案 1 :(得分:0)

我可能理解你的困惑,如果你想理解solr搜索,索引,分析,我认为你必须先学习lucene。为什么?因为solr是基于lucene,这是一个lucene维基网址,有用它可以帮助你! lucene wiki

答案 2 :(得分:0)

让我们使用您上面提到的例子。我们有2个文档:

Doc1: Harry Potter And The Half Blood Prince

Doc2: Harry Potter And The Deathly Hallows

构建倒排索引

  • 第1步 - 我们需要使用tokenizer将这些文档标记为术语。 所以,让我们说,我们使用Tokenizer A并得到以下结果:

    Doc1:HarryPotterAndTheHalfBloodPrince

    Doc2:HarryPotterAndTheDeathlyHallows

  • 第2步 - 构建倒排索引

    Harry - > Doc1,Doc2

    Potter - > Doc1,Doc2

    And - > Doc1,Doc2

    The - > Doc1,Doc2

    Half - > DOC1

    Blood - > DOC1

    Prince - > DOC1

    Deathly - > DOC2

    Hallows - > DOC2

查询/搜索

  • 第1步 - 我们还需要首先标记搜索词

    例如,我们的搜索词是Harry Potter。你有两个 tokenizer可供选择。 Tokenizer A与我们使用的那个相同 索引,将我们的单词标记为两个术语:HarryPotter。但Tokenzier B可以将它们标记为Harry Potter

  • 第2步 - 执行查询

    如果您选择Tokenizer A,则会获得HarryPotter,这两者都在我们的倒排索引中,然后您就可以获得搜索结果:Doc1和Doc2。 但是如果你选择Tokenizer B,你得到的术语Harry Potter不在我们的倒排索引中,这意味着你无法从倒排索引中检索任何结果。

  

结论:Solr / Lucene中的所有索引和搜索都是   基于条款。您可以选择不同的标记器/过滤器或   在索引或搜索过程中将它们组合在一起,您就会得到   不同的术语输出。请参考这个   http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters/。   它可以帮助您设计您的solr取决于您的具体   要求。

答案 3 :(得分:0)

在第一次近似中,反向索引只是有序(从法律到高度)文档ID数组。当您搜索多个术语时,它允许快速交叉和文档ID联合。为了提供更快的交叉,甚至比线性时序,它包含skip pointers,您可以在书Introduction to Information Retrieval中阅读它。本书很好地介绍了一般搜索引擎的工作原理。为了减少光盘操作和索引大小的i / o,使用了一些压缩机制,你也可以在本书中阅读introduction to them