按嵌套字段匹配百分比对ElasticSearch结果进行排序

3
我想根据嵌套字段的匹配百分比来订购ElasticSearch查询结果。 例如,假设我的ElasticSearch索引如下所示:
{
    "properties": {
        "name": {
            "type": "text"
        },
        "jobs": {
            "type": "nested",
            "properties": {
                "id": {
                    "type": "long"
                }
            }
        }
    }
}

使用以下文件:

{
    "name": "Alice",
    "jobs": [
        { "id": 1 },
        { "id": 2 },
        { "id": 3 },
        { "id": 4 }
    ]
}

{
    "name": "Bob",
    "jobs": [
        { "id": 1 },
        { "id": 2 },
        { "id": 3 }
    ]
}

{
    "name": "Charles",
    "jobs": [
        { "id": 2 },
        { "id": 3 }
    ]
}

现在,我想执行一个查询来查找具有特定工作的文档,并按匹配工作的百分比排序。 例如:

  • 搜索工作12,我希望顺序如下:
    1. Bob(匹配66%的工作)
    2. Alice(匹配50%的工作)
    3. Charles(匹配50%的工作)
  • 搜索工作2,我希望顺序如下:
    1. Charles(匹配50%的工作)
    2. Bob(匹配33%的工作)
    3. Alice(匹配25%的工作)

到目前为止,我使用了以下查询,但它按匹配次数排序,而不是按百分比排序:

{
    "query": {
        "nested": {
            "path": "jobs",
            "query": {
                "bool": {
                    "should": [
                        {
                            "match": {
                                "jobs.id": "1"
                            }
                        },
                        {
                            "match": {
                                "jobs.id": "2"
                            }
                        }
                    ]
                }
            },
            "score_mode":"sum"
        }
    }
}
1个回答

1
"

script_score 似乎完成了工作:

"
{
  "query": {
    "function_score": {
      "query": {
        "nested": {
          "path": "jobs",
          "query": {
            "bool": {
              "should": [
                {
                  "match": {
                    "jobs.id": "1"
                  }
                },
                {
                  "match": {
                    "jobs.id": "2"
                  }
                }
              ]
            }
          },
          "score_mode": "sum"
        }
      },
      "script_score": {
        "script": {
          "source": "_score / params['_source']['jobs'].length"
        }
      }
    }
  }
}

谢谢,这正是我要找的! - Enrico Vianello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接