我们说我的文档包含以下字段:{field1, field2, costprice, sellingprice}
我需要运行一些查询,其中某些条件需要costprice
和sellingprice
之间的差异
在标准SQL中,一个例子可能是:
SELECT * FROM Table1 where costprice-sellingprice>0
我如何在elasticsearch中实现这一目标?
答案 0 :(得分:3)
仍然需要脚本:
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": {
"script": {
"script": "doc['costprice'].value - doc['sellingprice'].value > 0"
}
}
}
}
}
答案 1 :(得分:1)
您可以使用脚本过滤器来完成此操作。
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"script": {
"script": "(Float.parseFloat(doc['costprice'].value) - Float.parseFloat(doc['sellingprice'].value) > 0"
}
}
}
}
}
}
}
默认情况下从v1.4.3关闭Groovy动态脚本 默认情况下,Groovy动态脚本是关闭的,这会阻止动态Groovy脚本作为请求的一部分被接受或从特殊的.scripts索引中检索。您仍然可以在每个节点上的config / scripts /目录中使用存储在文件中的Groovy脚本。 (https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html)
默认情况下,Elasticsearch已禁用动态脚本。对于cource,您可以在配置中启用它,但最好使用索引脚本。将您的脚本放在price.groovy
的Elasticsearch的{{1}}目录中很简单。 Elasticsearch将为您的脚本编制索引,因此您可以使用以下内容:
scripts
您的{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"script": {
"file": "price",
"lang": "groovy"
}
}
}
}
}
}
}
文件如下:
price.groovy