使用Elasticearch.NET和Nest 6.x:如何从多个索引中获取多个文档

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (384)
var ids = new Dictionary<string, List<string>>();
ids["Topic"] = new List<string> {"KL7KJ2QBWD77yvpxyjvd", "374wJ2QBWD77yvpxDjpX", "B7499GMBWD77yvpxFzgW"};
ids["Prod"] = new List<string>();
ids["Account"] = new List<string>();

我做了一个流畅的嵌套查询:

var results = client.MultiGet(m => 
m.Index("topics").GetMany<Topic>(ids["Topic"])

.Index("prods").GetMany<Prod>(ids["Prod"])

.Index("accounts").GetMany<Account>(ids["Account"])

它正在生成下面的请求。我们看到请求只使用最后一个索引集,即“Account”(这不是我需要的):

http://localhost:9200/accounts/_mget?pretty=true
{
  "docs": [
    {
      "_type": "Topic",
      "_id": "KL7KJ2QBWD77yvpxyjvd"
    },
    {
      "_type": "Topic",
      "_id": "374wJ2QBWD77yvpxDjpX"
    },
    {
      "_type": "Topic",
      "_id": "B7499GMBWD77yvpxFzgW"
    }
  ]
}
# Response:
{
  "docs" : [
    {
      "_index" : "accounts",
      "_type" : "Topic",
      "_id" : "KL7KJ2QBWD77yvpxyjvd",
      "found" : false
    },
    {
      "_index" : "accounts",
      "_type" : "Topic",
      "_id" : "374wJ2QBWD77yvpxDjpX",
      "found" : false
    },
    {
      "_index" : "accounts",
          "_type" : "Topic",
      "_id" : "B7499GMBWD77yvpxFzgW",
      "found" : false
    }
  ]
}

实际上,我想在FLUENT Nest中创建以下(有效的)Elasticearch查询请求(没有特定索引):

http://localhost:9200/_mget?pretty=true
{
  "docs": [
    {
      "_index": "topics",
      "_type": "Topic",
      "_id": "KL7KJ2QBWD77yvpxyjvd"
    },
    {
      "_index": "topics",
      "_type": "Topic",
      "_id": "374wJ2QBWD77yvpxDjpX"
    },
    {
      "_index": "topics",
      "_type": "Topic",
      "_id": "B7499GMBWD77yvpxFzgW"
    }
  ]
}

在FLUENT Nest中,是否有方法为每个ID列表指定每个索引/类型?

当然,如果我在ID中添加特定的ID“戳”和身份证“帐户”这将适当地产生.例如:

http://localhost:9200/_mget?pretty=true
{
  "docs": [
    {
      "_index": "topics",
      "_type": "Topic",
      "_id": "KL7KJ2QBWD77yvpxyjvd"
    },
    {
      "_index": "prods",
      "_type": "Prod",
      "_id": "xxxxx"
    },
    {
      "_index": "accounts",
      "_type": "Account",
      "_id": "yyyyy"
    }
  ]
}
提问于
用户回答回答于

每个都GetMany<T>(...)采用第二个参数,该参数是进一步描述调用的委托,包括提供索引名称

var ids = new Dictionary<string, List<string>>
{
    { "Topic", new List<string> { "topic1", "topic2", "topic3" } },
    { "Prod", new List<string> { "prod1", "prod2", "prod3" } },
    { "Account", new List<string> { "account1", "account2", "account3" } }
};

var multiGetResponse = client.MultiGet(m => m
    .GetMany<Topic>(ids["Topic"], (op, id) => op
        .Index("topics")
    )
    .GetMany<Prod>(ids["Prod"], (op, id) => op
        .Index("prods")
    )
    .GetMany<Account>(ids["Account"], (op, id) => op
        .Index("accounts")
    )
);

这导致了一个请求

POST http://localhost:9200/_mget
{
  "docs": [
    {
      "_index": "topics",
      "_type": "topic",
      "_id": "topic1"
    },
    {
      "_index": "topics",
      "_type": "topic",
      "_id": "topic2"
    },
    {
      "_index": "topics",
      "_type": "topic",
      "_id": "topic3"
    },
    {
      "_index": "prods",
      "_type": "prod",
      "_id": "prod1"
    },
    {
      "_index": "prods",
      "_type": "prod",
      "_id": "prod2"
    },
    {
      "_index": "prods",
      "_type": "prod",
      "_id": "prod3"
    },
    {
      "_index": "accounts",
      "_type": "account",
      "_id": "account1"
    },
    {
      "_index": "accounts",
      "_type": "account",
      "_id": "account2"
    },
    {
      "_index": "accounts",
      "_type": "account",
      "_id": "account3"
    }
  ]
}

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励