1

我正在尝试在 C# 中创建一个与对象无关的 Percolator 微服务。我可以使用用于映射的 JSON 对象创建和映射传递给我的方法的索引,我什至可以使用标准 NEST 查询格式针对索引注册一个渗透器,例如:

var percolateResponse = client.RegisterPercolator<dynamic>(query
    .Name, p=>p
        .Index(index.ActualName)
        .Query(q=>q
            .Term(t=>t
                .OnField("banana")
                .Value("green"))));

问题是,我需要能够传入查询的 JSON,并且我一直在尝试使用以下代码:

var percolateResponse = client.RegisterPercolator<dynamic>(query
    .Name, p=>p
        .Index(index.ActualName)
        .Query(q=>q.Raw(query.Context)));

我传入的 JSON 是:

{"query":
    {"term":
        {"banana":
            {"value": "green"}
        }
    }
}

但是发生了什么,而不是将指定的查询注册为过滤器查询,而是将 Query 的值设置RegisterPercolatorRequest为 null 并基本上取消查询(如果存在)。

我尝试了许多不同格式的 JSON,但没有找到.Query(q=>q.Raw(query.Context))喜欢的东西。

有谁知道如何解决这个问题?我已经越来越接近解决这个问题,但从来没有完全解决这个问题。这是我创建过滤器代理类的最后一个障碍。任何帮助表示赞赏。谢谢。

仅供参考,我得到的错误(在 Response 对象内部)是这样的:

[<indexName>] failed to parse query [<queryName>]]; 
nested: QueryParsingException[[<indexName>] [_na] query malformed, 
no field after start_object

我想我已经找到了我想要做的事情的解决方案......上面的查询不起作用,但是通过一些试验和错误,我发现了在对象不可知的查询中接受什么并注册一个渗滤器:

var percolateResponse = client.RegisterPercolator<dynamic>(query
    .Name, p => p
        .Index(index.ActualName)
        .Query(q => q
            .SimpleQueryString(sqs=>sqs
                .Query(query.Context))));

这会将查询创建为简单查询字符串并将其存储在 ElasticSearch 中,然后当我尝试过滤与该查询匹配的文档时似乎可以工作!

4

0 回答 0