【问题标题】:How to perform wildcard search on a date field?如何在日期字段上执行通配符搜索?
【发布时间】:2014-11-06 05:58:39
【问题描述】:

我有一个字段,其中包含 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

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

    希望对你有帮助。

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

    我建议你使用 Elasticsearch 的“Multi field”功能。 这意味着您可以同时按两种不同的字段类型索引“joiningDate”字段。 请查看并尝试下面的示例代码。

    创建索引

    curl -XPUT 'localhost:9200/blacksmith'
    

    定义“joiningDate”字段类型为“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
    

    尝试对“joiningDate.verbatim”字段而不是“joiningDate”字段进行通配符查询。

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

    【讨论】:

    • 是的,我知道这一点,但是一旦您尝试按月和日进行匹配,事情就会变得复杂。稍后我会更新问题以明确说明。
    • @blackSmith 我在答案中添加了一个新建议。
    • 我想使用 DSL 脚本,但由于版本限制,除了使用 multi_field 之外没有其他选择。现在我必须进行很多更改,而不仅仅是调整搜索查询。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2022-01-11
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多