Elastic Search NEST 客户端原始 + 自定义查询

Elastic Search NEST client raw + custom query

我正在使用 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 格式正确 JSON 对应于查询 DSL,您可以将其反序列化为 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"
        }
      }]
    }
  }
}