【问题标题】:Select documents which have a specific number of items of nested documents选择具有特定数量的嵌套文档的文档
【发布时间】:2019-03-21 11:08:01
【问题描述】:

我有结构(事件是嵌套文档):

{
  "id": 1,
  "events": [
    {
      "id": 1,
      "date": "<date 1>"
    },
    {
      "id": 2,
      "date": "<date 2>"
    },
    {
      "id": 4,
      "date": "<date 3>"
    }
  ]
}
...

如何使用 Elasticsearch.Net 和 NEST 进行查询以选择事件超过特定数量的文档?

【问题讨论】:

  • 您分享的 JSON 是针对 ElasticSearch 中的一个文档的吗?你能在 ElasticSearch 中分享你的索引定义吗?
  • 更新 "events" 数组中的单个对象将需要对整个对象进行索引,无论是作为输入传递,还是在 Elasticsearch 中的服务器端。

标签: c# .net elasticsearch nested nest


【解决方案1】:

注意脚本很慢,如果您有很多文档,最好设置一个字段 = 事件数并对其进行请求。

QueryContainer filterContainer = null;
    filterContainer &= Query<YOURTYPE>.Script(s =>
                    s.Inline("params._source.events.size() > YOURNUMBER"));

    Client.Search<YOURTYPE>(s => s
                                .MatchAll()
                                .Size(10000)
                                .Query(q => q.Bool(b => b.Must(filterContainer )))

【讨论】:

  • 事件的嵌套列表是可更新的。这个想法是更新事件而不更新其父文档的版本。
  • 在事件中添加一个字段不会真正帮助您,当然您可以在每个事件上添加一个索引 (1,2,3...),并检索最大索引(或将事件大小存储在所有事件项),或添加包含事件的第一个事件项 - 1 大小......所有这些解决方案都非常脏。为什么不能在父级上添加字段(您不必通过添加新字段来重新索引,也许您使用 2 个单独的工具构建父级文档和事件?)
  • 我们在当前版本的应用中有 EventsCount 字段。但是当字段发生变化时,文档的一个版本也会发生变化。更新文档的版本会调用繁重的操作。但是,当事件数量发生变化时,我们不需要执行操作。因此,我们决定尝试存储一个事件列表,我们可以在不更改父文档版本的情况下对其进行更改。
【解决方案2】:

如果您不通过脚本更新events,我只会在父文档中保留事件的实际计数。这将使搜索部分更容易和更有效。

文档架构:

public class Document
{
    public int Id { get; set; }
    public int EventsCount => Events?.Count ?? 0;
    public List<Event> Events { get; set; }
}

public class Event
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
}

和查询:

_elasticClient.Search<Document>(s => s
    .Query(q => q
        .Term(t => t.Field(f => f.EventsCount).Value(10))));

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2018-01-11
    • 2021-11-12
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多