【问题标题】:What exactly does the data structure of the inverted index in SOLR looks likeSOLR中倒排索引的数据结构究竟是什么样的
【发布时间】:2015-11-26 01:50:05
【问题描述】:

所有,请原谅我,我才刚刚开始学习如何使用 SOLR。强大的 SE。 而且我已经知道Inverted IndexSOLR 中搜索速度如此之快的原因。在许多阅读中。喜欢Solr in actionApache Solr search pattern。倒排索引的提及和描述如下。

我还知道Document 是由Fields 组成的。 以我对上述数据结构的理解。使用“Harry”等特定术语进行搜索时。 SE 将返回结果文档 1,2。我对此毫无疑问。

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

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

我对这个阅读感到困惑。

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

【问题讨论】:

    标签: apache solr lucene inverted-index


    【解决方案1】:

    我理解您的困惑,这是文献解释手头主题过度简化的情况之一。大多数文献解释和倒排索引使用的文档只是文本,因此(如图所示)一个文档只是一个字符序列,不存在其他“字段”。

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

    也许this post 可能有用,如果你一直往下看,阅读会有点密集,但如果你只是试图掌握要领,不要试图一口气读懂所有内容。请注意,Lucene 实现包含更多技术细节,例如,以确保性能和减少磁盘使用量。

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

    【讨论】:

    • 感谢您的理解。 +1 第一句话。
    • 请检查链接好吗?它被打破。返回 404.. 谢谢。hackerlabs.org/blog/2011/10/01/hacking-lucene-the-index-format
    • 哇!对此感到抱歉,当我发布回复时,该网站很好,尝试使用缓存的谷歌版本,对我有用。
    • 哈哈,太好了!所有的东西都是我要找的。谢谢你的精彩作品。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      Doc1: Harry Potter And The Half Blood Prince
      
      Doc2: Harry Potter And The Deathly Hallows
      

      建立倒排索引

      • 第 1 步 - 我们需要使用分词器将这些文档分词成术语。 因此,假设我们使用 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 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 要求。

      【讨论】:

      • 是的,它是教程中最流行的示例,例如 Solr in actionAppacheSolrSearchPattern 试图解释有关搜索如何工作以及索引结构如何的问题。但我认为这只是一些理论上的例子。它不是反映现实世界的那个。我相信它应该比你给我看的例子更复杂。谢谢。
      • 我的问题是搜索时。字段有什么用?你给我看的例子没有提到任何关于这个领域的事情..
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2012-05-10
        • 2015-01-17
        • 1970-01-01
        相关资源
        最近更新 更多