跨多种类型

时间:2016-06-30 18:20:41

标签: c# elasticsearch nest covariance

鉴于以下POCO:

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

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

我想执行一个返回ALL Dogs的查询,只返回已启用的Cats。

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

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

如何执行查询?,提前致谢

1 个答案:

答案 0 :(得分:2)

我们可以查询元数据_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查询{{1}中(或must在这种情况下我们也使用filter一元运算符使其成为过滤器),而+将包装成||查询{{1} }}。生成的执行查询看起来像

bool

产生

should

这只是一个计数,但是如果你要查看这些文件,那就是所有的狗,只有猫才能启用