跨多种类型的 ElasticSearch NEST 查询

ElasticSearch NEST query across multiple types

鉴于以下 POCO:

public class Dog
{
    public string Name { get; set; }
}

public class Cat
{
    public string Name { get; set; }
    public bool Enabled { get; set; }
}

我想执行 returns ALL Dogs and only Cats that are Enabled 的查询。

elastic 文档提供了以下示例,但没有详细说明如何使用带有查询或过滤器上下文的 Bool 来搜索多种类型的特定字段值:

.Search<object>(s => s
    .Size(100)
    .Type(Types.Type(typeof(Dog), typeof(Cat)))                
    .Query(...)

如何执行我的查询?提前致谢

我们可以查询元数据 _type 字段并将其与其他字段的查询结合起来。这是一个例子。我们将创建 100 只猫和 100 只狗,将每只偶数猫设置为禁用

void Main()
{
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var defaultIndex = "pets";
    var connectionSettings = new ConnectionSettings(pool)
            .DefaultIndex(defaultIndex);

    var client = new ElasticClient(connectionSettings);

    if (client.IndexExists(defaultIndex).Exists)
        client.DeleteIndex(defaultIndex);

    client.CreateIndex(defaultIndex, ci => ci
        .Mappings(m => m
            .Map<Dog>(d => d.AutoMap())
            .Map<Cat>(c => c.AutoMap())
        )
    );

    var dogs = Enumerable.Range(1, 100).Select(i => new Dog
    {
        Name = $"Dog {i}"
    });

    client.IndexMany(dogs);

    var cats = Enumerable.Range(1, 100).Select(i => new Cat
    {
        Name = $"Cat {i}",
        Enabled = i % 2 == 0 ? false : true
    });

    client.IndexMany(cats);
    client.Refresh(defaultIndex);

    client.Search<object>(s => s
        .Size(100)
        .SearchType(SearchType.Count)
        .Type(Types.Type(typeof(Dog), typeof(Cat)))
        .Query(q => 
            (+q.Term("_type", "cat") && +q.Term("enabled", true)) ||
            +q.Term("_type", "dog")
        )
    );
}

搜索查询利用了运算符重载;一元 + 运算符意味着查询将包装在 bool 查询 filter 中,类似地, && 将包装在 bool 查询中 must(或在本例中为 filter,因为我们还使用 + 一元运算符使其成为过滤器),并且 || 将包装到 bool 查询中 should.结果执行的查询看起来像

{
  "size": 100,
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "_type": {
                    "value": "cat"
                  }
                }
              },
              {
                "term": {
                  "enabled": {
                    "value": true
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "term": {
                  "_type": {
                    "value": "dog"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

产生

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 150,
    "max_score" : 0.0,
    "hits" : [ ]
  }
}

这只是一个计数,但如果您要查看文档,将会启用所有狗,只有猫