elasticsearch查询文本字段,其值长度超过20

时间:2017-08-22 07:22:46

标签: elasticsearch elasticsearch-5

我想使用以下内容查询带有长度值(文本)的名称超过20但不起作用:

GET /groups/_search
{
    "query": {
        "bool" : {
            "must" : {
                "script" : {
                    "script" : "_source.name.values.length() > 20"
                }
            }
        }
    }
}

错误消息是:

{
  "error": {
    "root_cause": [
      {
        "type": "script_exception",
        "reason": "compile error",
        "script_stack": [
          "_source.name.values.lengt ...",
          "^---- HERE"
        ],
        "script": "_source.name.values.length() > 5",
        "lang": "painless"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "groups",
        "node": "exBbDVGeToSDRzLLmOh8-g",
        "reason": {
          "type": "query_shard_exception",
          "reason": "failed to create query: {\n  \"bool\" : {\n    \"must\" : [\n      {\n        \"script\" : {\n          \"script\" : {\n            \"inline\" : \"_source.name.values.length() > 5\",\n            \"lang\" : \"painless\"\n          },\n          \"boost\" : 1.0\n        }\n      }\n    ],\n    \"disable_coord\" : false,\n    \"adjust_pure_negative\" : true,\n    \"boost\" : 1.0\n  }\n}",
          "index_uuid": "_VH1OfpdRhmd_UPV7uTNMg",
          "index": "groups",
          "caused_by": {
            "type": "script_exception",
            "reason": "compile error",
            "script_stack": [
              "_source.name.values.lengt ...",
              "^---- HERE"
            ],
            "script": "_source.name.values.length() > ",
            "lang": "painless",
            "caused_by": {
              "type": "illegal_argument_exception",
              "reason": "Variable [_source] is not defined."
            }
          }
        }
      }
    ]
  },
  "status": 400
}

不知道我应该怎么解决它......

fyi:es的版本是5.4.0

我不知道以下问题: 无痛的script_fields无法访问_source变量#20068 https://github.com/elastic/elasticsearch/issues/20068

2 个答案:

答案 0 :(得分:2)

处理此问题的最佳和最佳方法是使用name字段的长度索引另一个字段,让我们将其称为nameLength。这样你就可以在索引时转移计算名称字段长度的负担,而不必在查询时(重复)这样做。

因此,如果您有一个name字段(例如{"name": "A big brown fox"}),则在索引编制时,您可以创建一个名称字段长度的新字段,例如{"name": "A big brown fox", "nameLength": 15}

在查询时,您可以在range字段上使用简单快捷的nameLength查询:

GET /groups/_search
{
    "query": {
        "bool" : {
            "must" : {
                "range" : {
                    "nameLength": {
                       "gt": 20
                    }
                }
            }
        }
    }
}

答案 1 :(得分:1)

您可以使用:

params._source.name.length() > 20

如果这是一个罕见的查询,那可能没问题。否则,您应该为名称长度添加一个字段,并使用range查询。