我正在尝试实现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;
}
答案 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;
希望有帮助。