ElasticSearch:根据字段长度过滤文档

时间:2013-12-29 22:43:07

标签: lucene elasticsearch


我在SO上阅读了几个类似的问题并建议解决方案不起作用。
我想找到字短于8的所有字段

我的数据库屏幕:

database rows screen capture

我尝试使用此查询

执行此操作
{
  "query": {
    "match_all": {}
  },
  "filter": {
    "script": {
      "script": "doc['word'].length < 5"
    }
  }
}
我做错了什么?我错过了什么?

1 个答案:

答案 0 :(得分:9)

脚本中使用的任何字段都完全加载到内存中(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-scripting.html#_document_fields),因此您可能需要考虑其他方法。

你可以,例如使用regexp-filter查找特定长度的字词,格式为.{0,4}

以下是您可以使用的可运行示例:https://www.found.no/play/gist/2dcac474797b0b2b952a

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"word":"bar"}
{"index":{"_index":"play","_type":"type"}}
{"word":"barf"}
{"index":{"_index":"play","_type":"type"}}
{"word":"zip"}
'

# Do searches
# This will not match barf
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "filtered": {
            "filter": {
                "regexp": {
                    "word": {
                        "value": ".{0,3}"
                    }
                }
            }
        }
    }
}
'