如何将简单的 groovy 脚本转换为 lucene 表达式(或使用不同的方法)?

How to convert simple groovy script to lucene expression (or use different method)?

我正在使用以下搜索选项:

scriptSort = 
    _script:
        script: "if(doc['user.roles'].value=='contributor') return 1; else return 2;",
        type: "number",
        order: "asc"

options =
    query: ...
    size: ...
    from: ...
    aggs: ...
    sort: [scriptSort]

如您所见,我正在使用 _script 选项对结果进行排序。问题是我正在使用的搜索服务放弃了对 groovy 脚本语言的支持,我不得不以某种方式将此脚本重写为名为 Lucene expressions.

的东西

只是一次尝试,但它应该是一种非常通用的方法。根据 user.roles 字段的值,使用 function_score 定义您自己的筛选器,这些筛选器的评级应该不同。在我的示例中,我认为您应该将 "match_all": {} 替换为 query 下的任何内容(这就是我询问完整查询的原因):

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "term": {
              "user.roles": "contributor"
            }
          },
          "weight": 1
        },
        {
          "filter": {
            "bool": {
              "must_not": [
                {
                  "term": {
                    "user.roles": "contributor"
                  }
                }
              ]
            }
          },
          "weight": 2
        }
      ],
      "boost_mode": "replace"
    }
  },
  "sort": [
    {
      "_score": {
        "order": "asc"
      }
    }
  ]
}