我使用带有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"},...]。