Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting Elasticsearch不带脚本的自定义分类排序_Sorting_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Groovy - Fatal编程技术网 elasticsearch,groovy,Sorting,elasticsearch,Groovy" /> elasticsearch,groovy,Sorting,elasticsearch,Groovy" />

Sorting Elasticsearch不带脚本的自定义分类排序

Sorting Elasticsearch不带脚本的自定义分类排序,sorting,elasticsearch,groovy,Sorting,elasticsearch,Groovy,我在ElasticSearch中的文档中有一个分类字段(我们称之为political_party),我想实现以下排序算法: 如果政党是D或R,则放入第一桶。如果是G,它们应该都在末尾 在这两个存储桶中,结果应按注册日期排序 我知道可以这样做: { "sort": [ { "_script": { "script": "doc['political_party'].value == 'G' ? 0 : 1",

我在ElasticSearch中的文档中有一个分类字段(我们称之为
political_party
),我想实现以下排序算法:

  • 如果
    政党
    D
    R
    ,则放入第一桶。如果是
    G
    ,它们应该都在末尾
  • 在这两个存储桶中,结果应按注册日期排序
  • 我知道可以这样做:

    {
        "sort": [
            {
                "_script": {
                    "script": "doc['political_party'].value == 'G' ? 0 : 1",
                    "type": "number",
                    "order": "desc"
                }
            },
            {
                "date_registered": {
                    "order": "desc"
                }
            }
        ]
    }
    
    {
      "query": {
        "function_score": {
          "boost_mode": "replace",
          "functions": [
            {
              "filter": {
                "terms": {
                  "political_party": [
                    "D",
                    "R"
                  ]
                }
              },
              "weight": 2
            },
            {
              "field_value_factor": {
                "field": "date_registered",
                "factor": 1,
                "modifier": "none"
              }
            }
          ]
        }
      }
    }
    

    但是,由于运行脚本所需的配置以及托管ElasticSearch供应商的一些限制,我需要使用
    \u script
    字段在不使用
    \u script的情况下执行此操作。如何做到这一点?

    由于默认排序是在
    \u score
    字段上完成的,因此您可以使用计算自定义分数以匹配上述约束。不需要脚本

    其主要思想是为所有
    political\u party
    D
    R
    的文档赋予2的权重(并为
    G
    保留默认权重1),然后只需根据其
    注册日期字段为每个文档打分

    它是这样的:

    {
        "sort": [
            {
                "_script": {
                    "script": "doc['political_party'].value == 'G' ? 0 : 1",
                    "type": "number",
                    "order": "desc"
                }
            },
            {
                "date_registered": {
                    "order": "desc"
                }
            }
        ]
    }
    
    {
      "query": {
        "function_score": {
          "boost_mode": "replace",
          "functions": [
            {
              "filter": {
                "terms": {
                  "political_party": [
                    "D",
                    "R"
                  ]
                }
              },
              "weight": 2
            },
            {
              "field_value_factor": {
                "field": "date_registered",
                "factor": 1,
                "modifier": "none"
              }
            }
          ]
        }
      }
    }
    

    通过此查询,所有
    D
    R
    文档将向上冒泡,而
    G
    文档将向下冒泡。所有脚本都将根据其注册日期字段进行排序。

    您可以将脚本放入文件中。这样,您就不必启用ScriptingHanks。问题是我实际上也在用其他东西计算分数,所以我不确定我能不能做到这一点;这是一个简化的示例,但该示例有所帮助。如果您需要根据其他约束计算自己的自定义分数,
    function\u score
    正是解决方法,这个答案中还缺少什么?