搜索时将<object>作为类型传递给Search方法

时间:2019-10-22 05:41:18

标签: c# elasticsearch nest

我正在尝试实现SearchAll(),该方法从已经通过API编写的不同索引中获取并合并结果。例如,在我的情况下,“文档”是父类型,而“产品”,“用户”和“公司”是从“文档”类继承的特定类型。

我不希望将父级“文档”传递给Search()方法,因为那样不会获取特定的类型。因此,我改为传递“对象”。但是我不知道如何从“对象”中传递字段名称。

我编写的代码给我错误:

无法转换类型为“ System.Collections.Generic.Dictionary`2 [System.String,System.Object]”的对象来键入“ Common.SearchClient.Documents.Document”。

private static object SearchAll(string query, int skip = 0, int take = 10)
{
var outDocument = default(Common.SearchClient.Documents.Document);
var docs = _client.Search<object>(s => s
        .Index(Indices.Index(
            GetIndex<Common.SearchClient.Documents.User>().Name,
            GetIndex<Common.SearchClient.Documents.Company>().Name,
            GetIndex<Common.SearchClient.Documents.Product>().Name))
        .From(skip)
        .Size(take)
        .Query(q => q
        .MatchPhrasePrefix(c => c
        .Field(p => p.TryCast(outDocument) ? outDocument.Name : "Name")
        .Analyzer("standard")
        .Boost(1.1)
        .Query(query)
        .MaxExpansions(2)
        .Slop(2)
        .Name("search_all")
        )
    )).Documents;
return docs;
}

1 个答案:

答案 0 :(得分:0)

  

但是我不知道如何从“对象”中传递字段名称。

您可以利用Nest.Infer方法,因此您将能够以强类型方式访问类型字段

public class Document
{
    public string Id { get; set; }
    public string Text { get; set; }
}

Field<Document>(p => p.Text)

MatchPhrasePrefixz查询中的示例用法

await client.SearchAsync<object>(s => s
    .Query(q => q
        .MatchPhrasePrefix(m => m.Field(Field<Document>(p => p.Text)))));

请记住在您的CS文件中包含此静态导入

using static Nest.Infer;

希望有帮助。