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

带过滤器的弹性搜索布尔查询比不带过滤器的查询慢

莫宁
2023-03-14
"query":{
    "bool":{
        "must":[{
            "bool":{
                "minimum_should_match":1,
                "should":[
                    {"wildcard":{"header":"*hello*"}},
                    {"wildcard":{"body":"*hello*"}}
                 ]
            }
        }],
        "filter":[{
            "bool":{
                "must":[
                    {"terms":{"puid":["user1"]}},
                    {"terms":{"fid":["user1-1519812713"]}}
                ]
            }
        }]
    }
}

不带筛选器的查询:

"query":{
    "bool":{
        "must":[
            {"term":{"puid":"user1"}},
            {"terms":{"fid":["user1-1519812713"]}},
            "bool":{
                 "minimum_should_match":1,
                 "should":[
                     {"wildcard":{"header":"*hello*"}},
                     {"wildcard":{"body":"*hello*"}}
                 ]
            }}
        ]
    }
}

当我用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.454、1.316

共有1个答案

石喜
2023-03-14

首先,您要对第二个查询执行不同的查询。在第一个中,您使用了术语,在第二个中,您使用了一个术语和一个术语。尽管这不应该是什么重要的事情,但您对基准测试使用了完全相同的查询。

此外,您的筛选器查询使用了一个内部bool查询,我认为这是导致问题的原因。试着把它改成这个

"filter": [
  {"terms":{"puid":["user1"]}},
  {"terms":{"fid":["user1-1519812713"]}}
]

此外,您还可以检查Profile API以了解有关查询的更多细节

 类似资料:
  • 我在布尔查询中有一个筛选器问题。 我想应用一个基于3个字段的筛选器,其中至少有1个筛选器匹配: 我在这个查询中没有得到任何结果,但是我在索引中看到了很多相关的文档。 Opster Elasticsearch忍者测试: 例如你向我提出的1个例子,我有许多返回的结果。 然而,当我想对对象字段执行必须查询时,我没有得到与筛选器完美匹配的相同结果。 这里有一个例子: 仅使用must子句进行搜索 首先出现的

  • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

  • 我有证据: 我想从我的数据库中获得结果,它包含每个对象中的列表technicStatusList=new arraylist<>(),我想在其中有一个TechnicStatus仅值为isactive=true。 为此,我使用了相同的JPQL查询: 但是得到一个包含TechnicStatus的结果,该结果返回一个包含true和false的TechnicStatus.isactive=true,Tec

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

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

  • 我在ES中有两个问题。对于同一组文档,两者的周转时间都不同。两者在概念上都在做同样的事情。我没有什么疑问 1-这两者之间有什么区别?2-哪个更好使用?3-如果两者相同,为什么表现不同? 映射: 更新1: 我在同一组数据上尝试了bool/必须查询和bool/过滤器查询,但我发现了奇怪的行为 1-bool/必须查询能够搜索所需的文档 2-虽然bool/filter无法搜索文档。如果我删除第二个字段条件