筛选DSL查询搜索-Elasticsearch



我阅读了一些关于查询上下文和过滤上下文的文章和文档,了解到如果不需要进行全文搜索或评分无关紧要,那么最好使用过滤上下文在我的情况下,我想返回包含ID的日志…所以我意识到我应该只使用过滤器上下文,而不是查询上下文。除了全文搜索或评分之外,是否有一条硬基线来定义何时应该使用其中一个而不是另一个

所以我从我原来的DSL查询搜索cmd:

GET /customer-simulation-es-app-logs*/_search
{
"query": {
"match": {
"_id": "mJvG0nkBiU3wk_hrEd-8"
}
}

到过滤器上下文:

GET /customer-simulation-es-app-logs*/_search
{

"query": {
"bool": {
"filter": [
{"match": {"_id": "mJvG0nkBiU3wk_hrEd-8"}}
]
}
}
}
}

由于,我想使用NEST来执行我采用这种方法进行的查询搜索。

[HttpGet("GetAll/{_id}")]
public async Task<EsSource> GetAll(String _id)
{
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => q
.Bool(b => b
.Filter(f => f
.Match(m => m.Field("_id").Query(_id))))));
return response?.Documents?.FirstOrDefault();
}

这是使用NEST进行filter context的正确方法吗

这将是发出仅带有过滤器上下文的查询的正确方式。一些可能有助于的额外要点

  1. _id字段进行术语级查询,就像term查询一样就足够了,因为不涉及分析链
  2. 如果您知道包含文档的索引,那么get API将是一个更好的选择。不过,如果使用通配符索引模式,则意味着该索引可能未知
  3. NEST在查询上有方便的运算符重载,使编写布尔查询更加简洁。最后的查询可以更简洁地写成
var response = await _elasticClient.SearchAsync<EsSource>(s => s
.Index("customer-simulation-es-app-logs*")
.Query(q => +q
.Match(m => m
.Field("_id")
.Query(_id)
)
)
);

最新更新