2014-10-28 122 views
4

对于项目,我需要选择过滤器边界内和最接近数字值的文档。这是一个价格,我似乎无法找到这是否可能。在ElasticSearch的数值字段上按距离排序

说我有2个文件:

{ 
    "name": "Document1", 
    "price": 46.12, 
    "tags": ["tag1", "tag2"] 
} 
{ 
    "name": "Document2", 
    "price": 82.29, 
    "tags": ["tag1", "tag3"] 
}  

是否有可能获得与最接近66.23的价格文件?

+1

如果您的群集中启用了动态脚本,您可以使用基于脚本的排序:基于绝对差异进行排序http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html #_script_based_sorting – keety 2014-10-28 20:20:11

+0

这不是,但我启用它,因为ES只能通过我们软件的私有部分访问,所以看起来相对安全。我目前使用这样的: { “查询”:{ ... }, “排序”:{ “_script”:{ “脚本”:“CUR =(因子 - DOC ['有效载荷'age'] .value; if(cur <0){cur = cur * -1} else {cur = cur}“, ”type“:”number“, ”params“:{ ”factor“ 45 }, “order”:“asc” } } } – 2014-10-29 07:22:28

回答

5

答案(感谢keety)是使动态脚本,并添加排序方法是这样的:从最接近

{ 
    "query": { 
     "filtered" : { 
      "query":{ 
       "match_all" : { } 
      }, 
      "filter": {} 
     } 
    }, 
    "sort" : { 
     "_script" : { 
      "script" : "cur = (factor - doc['age'].value); if (cur < 0) { cur = cur * -1 } else { cur = cur}", 
      "type" : "number", 
      "params" : { 
       "factor" : 45 
      }, 
      "order" : "asc" 
     } 
    } 
} 

这种种到最远,就像一个魅力。谢谢!

+0

很高兴它工作正常 – keety 2014-10-29 14:05:00