如何检查 QueryContainer 是否具有特定属性?

Flo*_*gex 3 c# elasticsearch nest

在解析我自己的简单查询语言时,我正在为 NEST 客户端生成 Elasticsearch 查询。也就是说,解析器返回一个QueryDescriptor(它是 的别名Func<QueryContainerDescriptor<SearchResult>, QueryContainer>),然后可以使用它从 Elasticsearch 获取搜索结果。

当输入是类似 的查询时,将调用以下nestedObject.someField:someValue方法。GetQueryDescriptorquery == "nestedObject.someField:someValue"

// NestedObjectQueryToken.cs
public Func<QueryContainerDescriptor<SearchResult>, QueryContainer> GetQueryDescriptor(string query)
{
    // GetFieldNames() extracts the fields that the user search in from the query
    // (there could possibly be more than one field present)
    var nestedFields = query.GetFieldNames().Select(fieldName => new Field("nestedObject." + fieldName));
    return descriptor => descriptor.NestedFieldSearch(query, _ => _.Fields(fields));
}
Run Code Online (Sandbox Code Playgroud)
// QueryDescriptorExtensions.cs
public static QueryContainer NestedFieldSearch(this QueryContainerDescriptor<SearchResult> descriptor,
    string query, FieldsDescriptor nestedFields)
{
    return descriptor.Nested(n => n
        .Path("nestedObject")
        .Query(sub => sub
            .QueryString(queryString => queryString
                .Query(query)
                .Fields(nestedFields))))
}
Run Code Online (Sandbox Code Playgroud)

SearchResult是用于结果映射的类。

稍后将其QueryDescriptor应用于a SearchDescriptor<SearchResult>,以便可以在SearchNEST方法中使用。


我希望它们QueryDescriptor具有特定的属性。在上面的示例中,它应该包含一个嵌套查询,其内部查询的字段设置为“nestedObject.someField”。

现在我想通过单元测试来测试此属性,即不将查询发送到服务器。

我如何“查看内部QueryDescriptor”以断言其属性符合预期?

Rob*_*Rob 5

您可以通过将结果查询容器转换为IQueryContainer

QueryContainer Query(QueryContainerDescriptor<Document> q) =>
    q.Term(t => t.Field(f => f.Name).Value("something"));

var actual = Query(new QueryContainerDescriptor<Document>()) as IQueryContainer;

Assert.AreEqual("something", actual.Term.Value);
Run Code Online (Sandbox Code Playgroud)

希望有帮助。