Elasticsearch按数组的第一个元素排序

6
我正在使用 Elasticsearch 5.5,并且有一个具有如下映射的索引:
{
  "my_index": {
    "mappings": {
      "my_type": {
        "properties": {
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "my_array": {
            "properties": {
              "array": {
                "type": "float"
              },
              "length": {
                "type": "long"
              }
            }
          }
        }
      }
    }
  }
}

我希望能够按照标题搜索,并按照数组中的第一个值进行排序。同时,将这个第一个值设置为_score字段是非常好的。 因此,我已经准备了这样的请求:

GET my_index/my_type/_search
{
    "query": {
      "term": {
        "title.keyword": "Shorts"
      }
    }, 
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "inline": "doc['my_array.array'][0]"
            },
            "order" : "asc"
        }
    }
}

很不幸,它不能正常工作。我感觉缺少了些什么或有问题。


它给出了什么错误? - Hatim Stovewala
@HatimStovewala,没有错误,但顺序有误。 - Uladzislau Kaminski
请提供一些示例文档和响应吗?您对响应有什么期望,实际上又有什么内容呢?谢谢。 - Nikolay Vasiliev
@NikolayVasiliev 使用以下请求:GET my_index/my_type/_search { "sort" : { "_script" : { "type" : "number", "script" : { "lang": "painless", "inline": "doc['embeddings.array'][0]" }, "order" : "asc" } } } 响应如下:https://jsonblob.com/05e5893a-be1c-11e7-9ae8-cdd8d94a615d - Uladzislau Kaminski
访问数组的第一个元素的方式 doc['my_array.array'][0] 是否有效? - Uladzislau Kaminski
据我所见,数组的第一个位置上是最大的数?这怎么可能呢? - Uladzislau Kaminski
2个回答

4

正确使用Painless脚本的方式如下:

{
  "query": {
    "term": {
      "title.keyword": "Shorts"
    }
  },
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "inline": "params._source.my_array.array[0]"
      },
      "order": "asc"
    }
  }
}

1
正如Andrei在他的回答中指出的那样,您应该直接引用您的painless脚本中的_source
这是因为在Lucene索引(ElasticSearch构建在其上)中,没有原始顺序的概念。此外,数组的工作方式不同于您的期望:

对象数组的工作方式不同于您的期望:您无法查询数组中每个对象而不影响数组中的其他对象。

基本上,您正在通过从列表中选择一个随机数来进行排序。
Andrei建议使用_source,即读取原始JSON文档,解析并从中提取所需值(它能够工作)。但是_source很慢(因为它每次都需要从磁盘读取,而不是访问快速索引)。
您还有两个选项:
  • 将第一个元素作为单独的字段移动;
  • 使用 嵌套数据类型 并明确定义顺序。

希望这有所帮助!


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