Elasticsearch:按内部命中排序

SSG*_*SSG 1 elasticsearch

我有一个这样的有效载荷,相同的有效载荷将出现在所有文档中,但每个文档中每个标签的权重都不同。

{
  "tags": [
    {
      "tag": "tag1",
      "weight": 5
    },
    {
      "tag": "tag2",
      "weight": 10
    },
    {
      "tag": "tag3",
      "weight": 7
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我在映射中使用了嵌套字段,因为我想匹配数组元素而不是整个数组。

{
  "mappings": {
    "doc": {
      "properties": {
        "tags": {
          "type": "nested",
          "properties": {
            "tag": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "weight": {
              "type": "double"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的要求是搜索标签并根据文档中的权重对该特定标签进行排序。我试过下面的查询,但它没有按预期排序。

{
  "from": 0,
  "size": 50,
  "sort": [
    {
      "tags.weight": {
        "order": "asc",
        "nested_filter": {
          "term": {
            "tags.tag": "tag1"
          }
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

编辑添加示例

Exa:假设有 3 个文档

{     
      "uid":1,
      "tags": [
        {
          "tag": "tag1",
          "weight": 5
        },
        {
          "tag": "tag2",
          "weight": 10
        },
        {
          "tag": "tag3",
          "weight": 7
        }
      ]
    },
{     
      "uid":2,
      "tags": [
        {
          "tag": "tag1",
          "weight": 9
        },
        {
          "tag": "tag2",
          "weight": 10
        },
        {
          "tag": "tag3",
          "weight": 7
        }
      ]
    },
{     
      "uid":3,
      "tags": [
        {
          "tag": "tag1",
          "weight": 7
        },
        {
          "tag": "tag2",
          "weight": 10
        },
        {
          "tag": "tag3",
          "weight": 7
        }
      ]
    }
Run Code Online (Sandbox Code Playgroud)

当搜索“tag1”并按升序排序时,我应该得到低于输出,即文档应该根据“tag1”的权重排序。

{
  "uid": 1,
  "tags": [
    {
      "tag": "tag1",
      "weight": 5
    },
    {
      "tag": "tag2",
      "weight": 10
    },
    {
      "tag": "tag3",
      "weight": 7
    }
  ]
},
{
  "uid": 3,
  "tags": [
    {
      "tag": "tag1",
      "weight": 7
    },
    {
      "tag": "tag2",
      "weight": 10
    },
    {
      "tag": "tag3",
      "weight": 7
    }
  ]
},
{
  "uid": 2,
  "tags": [
    {
      "tag": "tag1",
      "weight": 9
    },
    {
      "tag": "tag2",
      "weight": 10
    },
    {
      "tag": "tag3",
      "weight": 7
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

提前致谢 !!

小智 5

inner_hits属性中,您可以设置sort.

例子:

"inner_hits":{
  "sort": [
    {
      "tags.tag": {
        "order": "asc"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后,在result, 内部hits,您将拥有已inner_hits排序对象的专有性。