【问题标题】:Grouping fields within a Lucene.Net document对 Lucene.Net 文档中的字段进行分组
【发布时间】:2013-01-11 13:43:55
【问题描述】:

在我们的应用程序中,我们一直在使用 Lucene.Net 来索引大量数据。字段本身是可配置的,因此字段的名称和类型可以随着每次重建而改变。在每个文档中,我们可以有多个具有相同名称的字段以及不同数量的数字和文本字段。由于我们在当前的开发中投入了大量工作,因此更改为不同的搜索引擎是行不通的。

事实是,在大多数情况下,它是一种魅力,但我们确实有一个我们似乎无法解决的困难。

假设我们要索引包含以下内容的文档“X”:

A 行 - 字段 1:4 + 字段 2:a
B 行 - 字段 1:8 + 字段 2:b

我们将创建的索引将包含 4 个字段:

  • 文档 X:
    • 字段 1:4(数字)
    • 字段2:一个(文本)
    • 字段 1:8(数字)
    • 字段2:b(文本)

(行 ID 不重要)

搜索 Field1:[3 TO 6] AND Field2:b 会对该文档产生影响。
但是,行所表示的字段之间的链接(链接 4 和 'a')消失了。

我们可以连接像 4_a 这样的值,但这会破坏我们的数字搜索,并且需要客户端知道连接哪些字段以获得正确的结果。这也会增加我们分析器的难度,因为对于每个字段,我们可以添加不同的分析器(主要用于语言目的)。

此外,我们可以使用相同的键为每一行创建一个单独的文档,并在搜索结果中添加一个 distinct,但这听起来不像是要走的路,是吗?它会大大增加文档的数量,因为我们将为我们现在创建的每个文档创建 20 到 100 个文档。我没有在性能或可用性方面对此进行测试,因为当前的实现不允许我很容易地尝试这个:-)

有谁知道我如何在 Lucene.Net 中的某些字段之间强制建立链接,但仍然保留一种单独搜索每个字段的方法?

【问题讨论】:

  • 我发现很难从问题的措辞中理解您实际搜索的内容。您是在查找单个行还是行聚合?请记住,Lucene 不是一个关系数据库,试图让它表现得像一个关系数据库通常不是一个好主意。

标签: lucene.net lucene


【解决方案1】:

一个组合是为链接添加另一个字段:

  • 文档 X:

    • 字段 1:4(数字)
    • 字段 2:一个(文本)
    • 字段 1:8(数字)
    • 字段 2:b(文本)
    • 链接:4_a
    • 链接:8_b

另一个组合是添加一个像MyDocument:X 这样的字段并分别索引每一行,每一行包含一个MyDocument 字段作为其文档。这可以让您稍后在流程中按文档进行过滤。

【讨论】:

    【解决方案2】:

    我个人不明白为什么增加文档数量会影响性能。至少在 Java 版本的 Lucene 中,大部分内存用于术语缓存 - per term 并且与文档计数无关(假设术语计数不变)。无法详细说明可用性,因为这是特定于您的应用的。

    要点是,一旦将行分组到文档中,就会丢失行关系信息。你可以通过添加额外的字段(比如rowInfoA:4_arowInfoB:8_b)来解决这个问题,但这似乎太麻烦了,实际上需要更多的内存。是的,您可以选择不索引而只存储这些辅助字段,但我(已给出信息)仍然更喜欢 1:1 行:文档映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-12
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多