Elasticsearch function_score with nested_objects

时间:2014-08-07 12:46:05

标签: elasticsearch

我的查询有问题。我使用查询来提升没有嵌套对象的文档。现在我使用nested_objects并更改查询以使用嵌套过滤器,但没有任何提升。 我得到了我预期的文件,但没有_score更改。

我做错了吗?

GET index/type/_search
{
   "query": {
      "function_score": {
         "filter": {
            "bool": {
               "must": [
                  {
                     "term": {
                        "parent.child": "test"
                     }
                  }
               ]
            }
         },
         "functions": [
            {
               "boost_factor": "100",
               "filter": {
                  "nested": {
                     "path": "parent",
                     "filter": {
                        "bool": {
                           "must": [
                              {
                                 "term": {
                                    "child": "test"
                                 }
                              }
                           ]
                        }
                     }
                  }
               }
            }
         ],
         "score_mode": "sum"
      }
   },
   "sort": "_score",
   "from": 0,
   "size": 320
}

编辑: 可能是由

引起的
  

嵌套过滤器

     

嵌套过滤器的行为与嵌套查询非常相似,但它除外   不接受score_mode参数。它只能用于   “过滤器上下文” - 例如在过滤的查询中 - 并且它的行为   像任何其他过滤器:它包括或排除,但它没有得分。

     

虽然嵌套过滤器本身的结果没有被缓存,但是   通常的缓存规则适用于嵌套过滤器内的过滤器。

     

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/nested-query.html

2 个答案:

答案 0 :(得分:2)

正如文件所说:

嵌套过滤器

嵌套过滤器的行为与嵌套查询非常相似,只是它不接受score_mode参数。它只能在“过滤器上下文”中使用 - 例如在过滤后的查询中 - 它的行为与任何其他过滤器一样:它包括或排除,但它不会得分

虽然嵌套过滤器本身的结果未缓存,但通常的缓存规则适用于嵌套过滤器内的过滤器。

http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/nested-query.html

答案 1 :(得分:0)

我觉得你的JSON应该看起来更接近(可能不完全是,我还没有测试过)。

{
   "query": {
      "function_score": {
         "query": {
           "nested": {
               "path": "parent",
               "query": {
                  "bool": {
                     "must": [
                        {
                           "term": {
                              "parent.child": "test"
                           }
                        }
                     ]
                  }
               }
            }
         },
         "functions": [
            {
               "boost_factor": "100"
            }
         ],
         "score_mode": "sum"
      }
   },
   "sort": "_score",
   "from": 0,
   "size": 320
}

具体来说,您不想过滤boost_factor,您只想将此function_score提升100个。实际的嵌套查询虽然位于query的{​​{1}}部分} {} function_score部分只包含functions。我想。