弹性搜索NEST客户端原始+自定义查询



我使用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"
}
}]
}
}
}

最新更新