如何在日期字段上执行通配符搜索?

时间:2014-11-06 05:58:40

标签: elasticsearch

我有一个包含2011-10-20等值的字段,其中包含映射:

"joiningDate": { "type": "date", "format": "dateOptionalTime" }

以下查询最终以 SearchPhaseExecutionException 结束。

"wildcard" : { "ingestionDate" : "2011*" }

似乎 ES(v1.1)并没有提供那么多的狂喜。 This post表明了脚本的想法(未接受的答案甚至更多)。我会试试,只是问是否有人已经这样做了?

期望
搜索字符串13应匹配joiningDate字段具有值的所有文档:

2011-10-13
2013-01-11
2100-13-02

1 个答案:

答案 0 :(得分:3)

我不确定我是否正确了解您的需求,但我建议您使用“范围查询”作为日期字段。 下面的代码将返回您想要获得的结果。

{
    "query": {
        "range": {
            "joiningDate": {
                "gt": "2011-01-01", 
                "lt": "2012-01-01" 
            }
        } 
    }
}'

我希望这可以帮到你。

编辑(搜索日期包含“13”本身。)

我建议您使用Elasticsearch的“多字段”功能。 这意味着您可以同时为两个不同的字段类型索引“joinedDate”字段。 请查看并尝试以下示例代码。

创建索引

curl -XPUT 'localhost:9200/blacksmith'

定义“joinedDate”字段类型为“multi_field”的映射。

curl -XPUT 'localhost:9200/blacksmith/my_type/_mapping' -d '{ 
    "my_type" : {
        "properties" : {
            "joiningDate" : {
                "type": "multi_field",
                "fields" : {
                    "joiningDate" : {
                      "type" : "date",
                      "format" : "dateOptionalTime"
                    },
                    "verbatim" : {
                      "type" : "string",
                      "index" : "not_analyzed"
                    }
                }
            } 
        }
    } 
}'

索引4份文件(3份文件包含“13”)

curl -s -XPOST 'localhost:9200/blacksmith/my_type/1' -d '{ "joiningDate": "2011-10-13" }'
curl -s -XPOST 'localhost:9200/blacksmith/my_type/2' -d '{ "joiningDate": "2013-01-11" }'
curl -s -XPOST 'localhost:9200/blacksmith/my_type/3' -d '{ "joiningDate": "2130-12-02" }'
curl -s -XPOST 'localhost:9200/blacksmith/my_type/4' -d '{ "joiningDate": "2014-12-02" }' # no 13

尝试使用通配符查询“joinedDate.verbatim”字段而不是“joinedDate”字段。

curl -XGET 'localhost:9200/blacksmith/my_type/_search?pretty' -d '{
    "query": {
        "wildcard": {
            "joiningDate.verbatim": {
                "wildcard": "*13*"
            }
        }
    }
}'