elasticsearch - Elasticsearch:如何在脚本函数中优化源参数?

标签 elasticsearch

我在名为products的Elasticsearch索引中具有以下数据

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 1,
          "currency" : "USD",
          "price" : 1
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 2,
          "currency" : "INR",
          "price" : 60
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 3,
          "currency" : "EUR",
          "price" : 2
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 5,
          "currency" : "MYR",
          "price" : 1
        }
      }
    ]
  }
}

我正在根据price字段对数据进行排序,
我有以下脚本可以这样做-
GET products/_search
{
    "query": {
        "function_score": {
            "query": {
                "match_all": {}
            },
            "functions": [{
                "script_score": {
                    "script": {
                        "params": {
                            "USD": 1,
                            "SGD": 0.72,
                            "MYR": 0.24,
                            "INR": 0.014,
                            "EUR": 1.12
                        },
                        "source": "doc['price'].value * (doc.currency.value == 'eur'? params.EUR : doc.currency.value == 'myr' ? params.MYR : doc.currency.value == 'inr' ? params.INR : 1)"
                    }
                }
            }]
        }
    },
    "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

由于currency索引中的product字段为text类型,
它使用标准分析器索引,将其转换为小写。

我希望优化脚本的这一部分,因为最终可能会使用20-30种货币-
"source": "doc['price'].value * (doc.currency.value == 'eur'? params.EUR : doc.currency.value == 'myr' ? params.MYR : doc.currency.value == 'inr' ? params.INR : 1)"

最佳答案

我可以使用以下可行的解决方案优化源脚本-

GET products/_search
{
    "query": {
        "function_score": {
            "query": {
                "match_all": {}
            },
            "functions": [{
                "script_score": {
                    "script": {
                        "params": {
                            "USD": 1,
                            "SGD": 0.72,
                            "MYR": 0.24,
                            "INR": 0.014,
                            "EUR": 1.12
                        },
                        "source": "doc['price'].value * params[doc['currency.keyword'].value]"
                    }
                }
            }]
        }
    },
    "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

关于elasticsearch - Elasticsearch:如何在脚本函数中优化源参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475114/

相关文章:

elasticsearch - 通过elasticsearch中嵌套字段值的总和查询文档

elasticsearch - Elasticsearch 2.3放置映射(尝试覆盖日期字段类型)错误

json - ElasticSearch 中的范围查询(GET without body)

json - 将节点Filebeat接收到Elasticsearch

elasticsearch - 从elasticsearch聚合中删除 ''存储桶

mysql - 从重复创建的 JSON 导入 Elasticsearch,但存储旧值

elasticsearch - 如何在 Elasticsearch 中添加自动创建日期

search - ElasticSearch中没有关联文档的构面

performance - ElasticSearch 预期性能

elasticsearch - Jena 使用 ElasticSearch 进行全文搜索问题