在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

function_score的functions内filter的boost值无效

Elasticsearch | 作者 dlliwei | 发布于2019年11月27日 | 阅读数:2580

如下查询中function_score的functions内filter的boost值无效,只weight有效
{
  "from" : 0,
  "size" : 20,
  "query" : {        
  "function_score" : {
"query" : {
  "bool" : {
"should" : [
   {"term":{"from":1}}
]
  }
},
"functions" : [
  {
"filter" : {
  "match_phrase" : {
"cnName" : {
  "query" : "苏州",
  "slop" : 0,
  "boost" : 10000.0
}
  }
},
"weight" : 1.0
  }              
],
"score_mode" : "sum",
"boost_mode" : "sum",
"max_boost" : 3.4028235E38,
"boost" : 1.0
  } 
  }
}
 
已邀请:

core_wzw - 某AILab搜索技术负责人

赞同来自: dlliwei

楼上没看楼主具体的DSL,答不到楼主疑问的点。
我们知道filter不产生分数,纯召回而已,大家都是0/1。所以楼主你filter里的boost自然没生效,但为什么外层的weight生效了呢,因为这个filter放在function列表里,被当作一个query单元,weight作用在这个0/1单元上,给你产生weight可以作用在filter上的错觉。你试下把weight改成10,那么explain出来的这个function就是10分(10*1)。

liuxg - Elastic

赞同来自:

filter 不能改变score。这个和match是有区别的。另外一个区别是filter是可以cache的,而match是不可以的。filter的效率会比较高

要回复问题请先登录注册