我使用NEST客户端查询ES,但现在我有一个特定的情况-我试图将查询代理到ES,但默认应用特定的查询:
public IEnumerable<TDocument> Search<TDocument>(string indexName, string query, string sort, int page, int pageSize) where TDocument : class
{
var search = new SearchRequest(indexName)
{
From = page,
Size = pageSize,
Query = new RawQuery(query),
};
var response = this.client.Search<TDocument>(search);
return response.Documents;
}
上面的代码只是将查询代理到ES,但如果我需要应用应该始终与传递的查询一起应用的特定过滤器,该怎么办?
例如,我希望默认情况下Active
字段为true
。如何将此原始查询与某些特定且始终应用的过滤器合并(如果可能,不合并字符串以形成合并的ES API调用(。
假设query
是与查询DSL相对应的格式良好的JSON,则可以将其反序列化为QueryContainer
的实例,并将其与其他查询组合。例如
var client = new ElasticClient();
string query = @"{
""multi_match"": {
""query"": ""hello world"",
""fields"": [
""description^2.2"",
""myOtherField^0.3""
]
}
}";
QueryContainer queryContainer = null;
using (var stream = client.ConnectionSettings.MemoryStreamFactory.Create(Encoding.UTF8.GetBytes(query)))
{
queryContainer = client.RequestResponseSerializer.Deserialize<QueryContainer>(stream);
}
queryContainer = queryContainer && +new TermQuery
{
Field = "another_field",
Value = "term"
};
var searchResponse = client.Search<TDocument>(s => s.Query(q => queryContainer));
它将转换为以下查询(假设默认索引为_all
(
POST http://localhost:9200/_all/_search?pretty=true&typed_keys=true
{
"query": {
"bool": {
"filter": [{
"term": {
"another_field": {
"value": "term"
}
}
}],
"must": [{
"multi_match": {
"fields": ["description^2.2", "myOtherField^0.3"],
"query": "hello world"
}
}]
}
}
}