query_string字段中的日期类型属性始终给出错误

时间:2015-06-08 11:02:49

标签: date elasticsearch

我在索引中有一个类型具有日期类型的属性。我需要在query_string中搜索这个日期。

所以这是该类型的映射。

    .......
    .......

    "created": {
        "type": "date",
        "format": "yyyy-MM-dd'"'T'"'HH:mm:ss.SSSZ"
    },

    .......
    .......

查询是

                "query_string": {
                    "fields": [...... "created", .....],
                    "query": query
                }

现在假设查询没有日期,用户搜索了其他任何内容。仍尝试用日期类型解析每个字符串并给出错误。 而且我尝试过提供ISO日期或正常日期之类的查询,但是每次它给出的错误都无法解析。

我搜索了#34;找到abcd"。哪里应该归还一些东西。因为有记录在其他属性中有abcd。但它给出了这个错误

Caused by: org.elasticsearch.ElasticsearchParseException: failed to parse date field [find], tried both date format [yyyy-MM-dd'T'HH:mm:ss.SSSZ], and timestamp number

我已提供ISO日期2015-06-08T06:22:09.540Z并收到此错误

Caused by: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '2015-06-08T06:22:09.540Z': Encountered " ":" ": "" at line 1, column 16.
Was expecting one of:
    <EOF> 
    <AND> ...
    <OR> ...
    <NOT> ...
    "+" ...
    "-" ...
    <BAREOPER> ...
    "(" ...
    "*" ...
    "^" ...
    <QUOTED> ...
    <TERM> ...
    <FUZZY_SLOP> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    <REGEXPTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...

    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:132)
    at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:887)
    at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:233)
    ... 15 more

但是当我没有在query_string的字段中包含Date type字段时,一切都运行得很好。 我现在应该怎么做才能解决这个问题? 我没有在stackoverflow和Elasticsearch The Definitive Guide中找到任何相关的问题。请帮帮我。

1 个答案:

答案 0 :(得分:0)

"lenient": true中设置"query_string"以忽略这些转化例外:

            "query_string": {
                "fields": [...... "created", .....],
                "query": query,
                "lenient": true
            }

引自the documentation

  

宽松

     

如果设置为true将导致忽略基于格式的失败(如向数字字段提供文本)。

与完全日期搜索相关,query_string:视为特殊字符,需要进行转义。看看here,了解更多相关信息:

  

如果你需要在查询本身中使用任何作为运算符的字符(而不是运算符),那么你应该使用前导反斜杠来转义它们。例如,要搜索(1 + 1)= 2,您需要将查询编写为(1 + 1)\ = 2.

     

保留字符为:+ - =&amp;&amp; || &GT; &LT; ! (){} [] ^“〜*?:\ /