首页 > 解决方案 > Elasticsearch 查询嵌套文档并在聚合期间使用嵌套文档分数进行排序

问题描述

我有一组看起来像的文件

文件 1:

{
  outerField: [
    {
       innerField: "Hello there world"
    },
    {
       innerField: "Hey World"
    }
  ]
}

文件 2:

{
  outerField: [
    {
       innerField: "Hello world"
    },
    {
       innerField: "Hello"
    }
  ]
}

有没有办法搜索嵌套对象并返回那些嵌套对象,其中每个搜索命中都是一个嵌套对象,按嵌套对象与搜索查询的匹配程度排序?例如,如果我搜索 innerField = “hello there world” 的嵌套对象,我想要的结果如下:

点击:

{
    innerField: "Hello there world"
},
{
    innerField: "Hello world"
},
{
    innerField: "Hello"
},
{
    innerField: "Hey World"
}

基本上我想查询这个索引,就好像数据被索引一样:

文件 1:

{
    innerField: "Hello there world"
}

文件 2:

{
    innerField: "Hello world"
}

文件 3:

{
    innerField: "Hello"
}

文件 4:

{
    innerField: "Hey World"
}

我发出一个像这样的查询

{
    "query": {
        "match": {
            "innerField": "hello there world"
        }
    }
}

编辑:

POST index/_search
{
  "size": 0,
  "query": {
    "nested": {
      "path": "outerField",
      "query": {
        "match": { "outerField.innerField": <query> }
      },
      "score_mode": "max"
    }
  },
  "aggs": {
    "nested": {
      "nested": {
        "path": "outerField"
      },
      "aggs": {
        "filter": {
          "filter": {
            "match": { "outerField.innerField": <query> }
          },
          "aggs": {
            "bucket": {
              "top_hits": {
                "size": 100
              }
            }
          }
        }
      }
    }
  }
}

这很接近,但问题是每个嵌套对象都被赋予文档中所有嵌套对象的最大分数,因此聚合的排序是错误的。有没有办法让聚合中的每个对象保持该嵌套对象的原始分数?

标签: elasticsearchlucene

解决方案


推荐阅读