【问题标题】:Lucene.Net range subquery not returning expected results (RavenDB related)Lucene.Net 范围子查询不返回预期结果(RavenDB 相关)
【发布时间】:2015-08-19 17:18:00
【问题描述】:

我正在尝试编写一个 lucene 查询来过滤 RavenDB 中的一些数据。此特定集合中的某些文档被分配了一个序列号,并且有效范围不是连续的(例如,一个范围可以从 100 到 200,另一个范围可以从 1000 到 1400)。我想使用 Raven Studio(v2.5,Silverlight 客户端)查询 RavenDB,以检索所有值超出这些用户定义范围的文档。

这是过度简化的文档结构:

{  
   ExternalId: something/1,
   SequentialNumber: 12345
}

为了测试,我添加了 3500 个文档,所有这些文档都有一个 SequentialNumber,它位于以下两个范围之一内:123-3129000-18000,除了一个具有 100000123 的文档。 ExternalId 字段是对父文档的引用,对于此测试,所有文档的字段都设置为 something/1。这是我想出的 Lucene 查询:

ExternalId: something/1 AND NOT 
(SequentialNumber: [123 TO 321] OR SequentialNumber: [9000 TO 18000])

在 RavenDB 的 Studio 中运行查询会返回 SequentialNumber 不在 123-321 范围内的所有文档。我希望它只返回具有100000123 作为SequentialNumber 的文档。我一直在尝试向谷歌寻求帮助,但到目前为止,我还没有找到任何可以引导我走向正确方向的东西。

我做错了什么?

【问题讨论】:

    标签: lucene ravendb lucene.net ravendb-studio


    【解决方案1】:

    RavenDB 以两种方式对数字进行索引,一种是字符串(您在此处看到的),另一种是数字形式。 对于范围查询,请使用:

    SequentialNumber_Range: [Ix123 TO Ix321] OR SequentialNumber_Range: [Ix9000 TO Ix18000])
    

    Ix 前缀表示您使用的是 int32

    【讨论】:

    • 谢谢!这解决了一个问题。由于该字段在索引中标记为 Long (Sort(x => x.SequentialNumber, SortOptions.Long)),因此我不得不将 Ix 更改为 Lx。现在,如果我在没有 NOT (ExternalId: something/1 AND (SequentialNumber_Range: [Lx123 TO Lx321] OR SequentialNumber_Range: [LX9000 TO LX18000])) 的情况下运行查询,我会得到预期的结果:除了超出范围的文档之外的每个文档。我似乎无法完成的是让 Lucene 执行 NOT 以便它返回范围之外的文档。这是 RavenDb 范围之外的 Lucene 限制吗?
    • 没关系,在 Raven Studio 中折腾了几分钟后,它终于返回了预期的结果。不知道那里发生了什么,它一定是 UI 的事情。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多