当前位置: 首页 > 知识库问答 >
问题:

过滤DSL查询搜索-Elasticsearch

鲜于华容
2023-03-14

我阅读了一些关于查询上下文和过滤上下文的文章和文档,了解到如果你不需要进行全文搜索或评分,最好使用过滤上下文。就我而言,我想返回包含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进行过滤上下文的正确方法吗?

共有1个答案

丰超
2023-03-14

这是发出仅包含筛选器上下文的查询的正确方法。一些可能有帮助的额外要点

  1. _id字段进行术语级查询(如术语查询)应该就足够了,因为不涉及分析链
  2. 如果您知道包含文档的索引,则获取 API 将是更好的选择。但是,给定正在使用通配符索引模式,这意味着索引可能未知。
  3. NEST 在查询上具有方便的运算符重载,使编写 bool 查询更加简洁。最终查询可以更简洁地写成
var response = await _elasticClient.SearchAsync<EsSource>(s => s
    .Index("customer-simulation-es-app-logs*")
    .Query(q => +q
        .Match(m => m
            .Field("_id")
            .Query(_id)
        )
    )
);
 类似资料:
  • 问题内容: 所有人都希望使用过滤的查询,其中结果应包含来自“ query_string”和来自“ term-filter”的数据。 预期结果是: 所有带有topic_id的字母“ a”或“”的博客记录均为10。 即使其描述为空白/空,也会记录topic_id为10的其余记录。 因此,最终结果应该是-具有较高分数的匹配记录,并且应该位于顶部,然后才是与过滤器中的“ topic_id”匹配的记录。 问

  • 我正在使用以下搜索: 我现在想使用弹性搜索在索引过程中提供的id ()来过滤结果。例如,{}。我猜你得用查询这个词。结果应该是只有当< code>_id匹配时,文档才返回。我该怎么做呢?

  • 不带筛选器的查询: 当我用curl:curl-w'\ntime_total:%{time_total}\n'-h'content-type:application/json'-xget-d‘{}':9200/store/msg/_search?routing=user1来度量这两个查询的性能时 不带筛选器的查询得到的总时间:1.134、1.237、1.107,带筛选器的查询时间:1.322、1.4

  • 在Udemy教程中,我在这里遇到了这个查询: 我想知道是否有可能优化它?我在想两种可能的方法: > 将“流派”放入筛选器上下文中。但是一部电影可能有多种类型,所以我不确定使用type关键字和filter-term是否能在那里工作。 直接将“must_not”放在过滤器上下文中(没有bool)是行不通的,因为据我所知,过滤器不允许“过滤掉”,只允许“过滤保留什么”。但是如果我将must_not包装在

  • 我有一份这样的文件 下面是我到目前为止所尝试的

  • 问题内容: “过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如 情况1: 情况2: 我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using- filter-outside-td3960119.html中 找到了此讨论,但所引用的URL是404,并且解释过于简洁我。 请示教或提供指出这些区别的