我正在尝试在 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 中,然后当我尝试过滤与该查询匹配的文档时似乎可以工作!