代码之家  ›  专栏  ›  技术社区  ›  Phil

ElasticSearch:使用过滤器和常量“分数”优化查询?

  •  0
  • Phil  · 技术社区  · 5 年前

    在Udemy教程中,我在这里遇到了这个问题:

    { "query": { "bool": {
        "must": {"match": {"genre": "Sci-Fi"}},
        "must_not": {"match": {"title": "trek"}},
        "filter:" {"range": {"year": {"gte": 2010, "lt": 2015}}}
    }}}
    

    我想知道是否可以优化它?我正在考虑两种可能的方法:

    1. 将“流派”放在过滤器上下文中。但是一部电影可能有多种类型,所以我不确定使用类型关键字和过滤术语是否可以在那里工作。

    2. 直接将“must_not”放在过滤器上下文中(没有bool)将不起作用,因为据我所知,过滤器不允许“过滤掉”,只允许“过滤要保留的内容”。但是,如果我必须将查询包装在一个常量分数或过滤器bool中,那么查询的性能会更高吗?或者ES会自动处理这些优化吗?我只是不明白为什么必须不在查询中,而不是首先过滤上下文。某些东西只能部分不匹配,从而只能降低一个程度吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Val    5 年前

    关于1:

    搬家 genre 与过滤器上下文匹配可能会加快一点速度(尽管这取决于许多其他因素),但您将失去排名,这对您来说可能重要,也可能不重要。最后,使用 must 当排名很重要或 filter 如果不是这样的话,你唯一的目标就是匹配一个文档或者不给出一些标准。

    此外,使用类型关键字只会得到“精确匹配”的语义,这可能是您想要的…或者不,这取决于您创建查询的方式(用户输入或控制的选择列表)。

    关于2:

    must_not already in a filter context 所以它不会比你已经看到的更简单。筛选器上下文由两个部分组成 滤波器 + 绝对不能 .

    最后一件事是,当有人问到性能优化时,我总是补充: Premature optimization is the root of all evil 所以,只有当你真正看到性能问题的时候,才这样做,这是前所未有的。