【问题标题】:Solr schema questionsSolr 模式问题
【发布时间】:2011-12-30 08:45:58
【问题描述】:

刚刚编译了一些关于模式的基本 solr 问题。

我的情况:以前有一个多核的 solr 实例,每个核包含不同的文档结构。尽管一个核心中文档中的信息与其他不同核心中的文档相关,但特定的法律限制迫使我们将这些数据分散在独立的实例中。因此,每次向 solr 实例发出请求时,都会查询几个核心,客户端应用程序“合并”并构建几个独立核心的响应。为了举例说明:假设我们是一家音乐商店,听起来很愚蠢,我们有一个用于 CD 的核心、一个用于 DVD 的核心、一个用于磁带的核心等,每个都有自己不同的架构;然后当员工检查库存时,所有这些核心都会返回他们的响应,让员工计算机中的应用程序读取、处理不同的结构,并将结果呈现为一个统一的列表。

好吧,法律限制已经解除,我们现在将核心合并在一起,到目前为止,很大程度上依赖于 dynamicFields 来实现架构灵活性。然而,这带来了许多全新的挑战和一些疑问:

1 - 更好的是:减少文档的数量,每个文档都有大量的字段(我们说的是数百个,有时这里或那里有一千个,全部编入索引),还是将信息分散在几个小型文档中?从理论上我一直在阅读的内容来看,第一种方法是可取的,但我不认为任何案例都考虑了这么多的字段。

2 - 是否可以执行任何类型的关系搜索?我的意思是拥有以下文件:

     <doc>
        <ID>ALB@1234</ID>
        <artist_t>Metallica</artist>
        <album_t>Saint Anger</album>        
      </doc>

      <doc>
        <ID>PROD@12</ID>
        <AlbID>ALB@1234</AlbID>
        <format_t>CD</format_t>
        <price_m>8.99</price_m>     
      </doc>

      <doc>
        <ID>PROD@13</ID>
        <AlbID>ALB@1234</AlbID>         
        <format_t>MP3</format_t>
        <price_m>3.99</price_m>     
      </doc>

然后在执行对 Metallica 的搜索时,是否已检索到所有三个文档?请记住,将最后两个文档的信息作为多值存储在第一个文档中的方法并不是一个真正的选择,因为据我所知,没有办法 p.e.按价格检索与范围搜索匹配的正确格式。

3 - 或者,是否可以将某种子文档结构定义为文档的一部分,就像在多级文档中一样?同样,我在这里不是指 poly 或 multiValued 字段,因为据我所知,它们不适合更复杂和结构化的信息。曾是 考虑以下内容:

    <doc>
        <ID>ALB@1234</ID>
        <artist_t>Metallica</artist>
        <album_t>Saint Anger</album>        
        <formats>
            <format_x><ID>PROD@13</ID><AlbID>ALB@1234</AlbID><format_t>MP3</format_t><price_m>3.99</price_m></format_x>     
            <format_x><ID>PROD@12</ID><AlbID>ALB@1234</AlbID><format_t>CD</format_t><price_m>8.99</price_m></format_x>      
        </formats>          
      </doc>

4 - 一个考虑:当然,这种情况可以通过像 2) 中描述的那样对模式进行建模并对服务器执行多个查询来解决,但这并不是最理想的解决方案。

期待任何意见或建议。抨击不太受欢迎,但仍然可以接受,对我放轻松。 ;) 如果这些问题听起来很愚蠢,但在这里确实需要一些帮助,我很抱歉。

【问题讨论】:

    标签: solr schema


    【解决方案1】:

    这实际上取决于您希望如何构建数据以及您希望如何对数据进行搜索。
    文档中的字段数没有限制。
    如果您可以规范化同一文档中的数据,将有助于您一次检索文档和所有相关详细信息。

    对于关系搜索,Solr 引入了Solr Join 功能,可以帮助您加入文档。
    但是,这仅适用于 Solr Trunk。因此,除非您可以使用 Solr Trunk 构建,否则这不是您的选择。

    Solr 没有子文档结构。但是,您可以尝试使用多值字段来映射内容。甚至使用分隔值。

    <album>
        <cd_id>
            <str>cd_1</str>
            <str>cd_2</str>
        </cd_id>
        <cd_price>
            <str>cd_1_price</str>
            <str>cd_2_price</str>
        </cd_price>
    </album>
    

    应该保持多值字段的顺序(因此您可以将 cd_1 映射到位置为 1 的 cd_1_price),并且您应该能够在客户端重新创建数据。

    【讨论】:

    • 很高兴了解 Solr Join,以前从未听说过。即使我认为没有机会实现主干构建,我也一定会调查它。关于您的其余答案:多值字段不是一种选择,因为我的真实生活情况涉及更多层次的深度和非常复杂的结构,所有这些都是完全可搜索的。我还想听听您对 1) 问题的看法;我知道没有字段限制,但想知道推荐的方法是什么:更少的文档,每个 VS 更多文档中的大量数据,每个更少的数据量。
    • 从我的角度来看,这取决于我,我想更容易地组织数据以满足我的要求。如果集合很小,那么具有更多字段的文档可能对您很有效。但是,如果它是一个非常大的集合,您需要检查 FieldCache 对象。这些对象为索引中可用的全部文档集缓存一个字段的值,您无法通过 Solr 配置调整此缓存,这可能会导致内存问题。虽然这不是专家意见,但 Solr 论坛将是获得这些答案的最佳场所。
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2016-06-30
    • 2016-10-30
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多