ElasticSearch自定义得分脚本不保留数组排序

时间:2014-04-25 07:13:04

标签: elasticsearch

我使用带有function_score属性的ElasticSearch来检索按createdOn排序的文档。 createdOn字段存储为表示日期值的数组,即

"createdOn": [ 2014, 4, 24, 22, 11, 47 ]

如果createdOn [0]为年,createdOn [1]为月,createdOn [2]为day等。我正在测试以下查询,该查询应返回按年度评分的文档。但是,doc [' createdOn']数组不保留元素的值。在此查询中,doc [' createdOn']。values [0]返回4,而非2014年。

POST /example/1
{
  name:"apple",
  createdOn: [2014, 8, 22, 5, 12, 32]
}

POST /example/2
{
  name:"apple",
  createdOn: [2011, 8, 22, 5, 12, 32]
}

POST /example/3
{
  name:"apple",
  createdOn: [2013, 8, 22, 5, 12, 32]
}

POST /example/_search
{
  "query":
  {
    "function_score": {
      "boost_mode": "replace",
      "query": { 
        "match_all": {}
      },
      "script_score" : {
          "script": "doc['createdOn'].values[0]"
      }
    }
  }
}

这似乎是由于ElasticSearch缓存数据的方式:http://elasticsearch-users.115913.n3.nabble.com/Accessing-array-field-within-Native-Plugin-td4042848.html

除了使用源方法(速度慢)之外,唯一明显的解决方案是使用嵌套查询。关于如何使用嵌套查询重写查询的任何想法?这似乎是按年度排序此查询的唯一有效方法。

  

docFieldDoubles方法从内存中获取它的值   字段数据缓存的结构。这样做是为了表现。该   字段数据缓存未从文档源加载(因为   这将是缓慢的)但是从lucene索引,值是   排序(查找速度)。 get api基于原始工作   文档源,这就是为什么你按顺序看到这些值(注意 - ES   没有解析get api的源代码,它只是让你回来   你把它放进去了什么。)

     

您可以使用以下方式访问原始文档(将被解析)   SourceLookup(可从源方法获得),但它会很慢   它需要为每个文档转到磁盘。

     

我不确定你想要的确切语义   实现,但你尝试看嵌套对象?那些允许你   将对象列表存储在一起保存值的原因,如[{   " key":" k1" ,"价值" :" v1"},...]。

0 个答案:

没有答案