过滤 DSL 查询搜索 - Elasticsearch

Filtering DSL Query Search - Elasticsearch

我阅读了一些关于查询上下文和筛选上下文的文章和文档,了解到如果您不需要进行全文搜索或评分无关紧要,最好使用筛选上下文。 在我的例子中,我想要 return 包含 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. 一个term-level query on the _id field, like a term query就足够了,因为不涉及分析链
  2. 如果您知道包含文档的索引,get API 将是更好的选择。尽管正在使用通配符索引模式,但暗示该索引可能未知。
  3. NEST 有 convenient operator overloads on queries to make writing bool queries more succinct。最终的查询可以更简洁地写成
var response = await _elasticClient.SearchAsync<EsSource>(s => s
    .Index("customer-simulation-es-app-logs*")
    .Query(q => +q
        .Match(m => m
            .Field("_id")
            .Query(_id)
        )
    )
);