elasticsearch,Date,elasticsearch" /> elasticsearch,Date,elasticsearch" />

Date 查询字符串字段中的日期类型属性始终出现错误

Date 查询字符串字段中的日期类型属性始终出现错误,date,elasticsearch,Date,elasticsearch,我在索引中有一个类型,它的属性是日期类型。我需要在查询字符串中按此日期搜索 这是该类型的映射 ....... ....... "created": { "type": "date", "format": "yyyy-MM-dd'"'T'"'HH:mm:ss.SSSZ" }, ....... ....... 问题是 "query_string": {

我在索引中有一个类型,它的属性是日期类型。我需要在查询字符串中按此日期搜索

这是该类型的映射

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

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

    .......
    .......
问题是

                "query_string": {
                    "fields": [...... "created", .....],
                    "query": query
                }
现在假设查询没有日期,用户搜索其他任何内容。但它仍然试图用日期类型解析每个字符串并给出错误。 我尝试过像ISO date或normal date这样给出查询,但每次给出的错误都无法解析

我搜索了“查找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
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
我给出了ISO日期2015-06-08T06:22:09.540Z,并得到了此错误

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
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
原因:org.apache.lucene.queryparser.classic.ParseException:无法分析“2015-06-08T06:22:09.540Z”:在第1行第16列遇到“”:“”:。
我期待的是:
...
...
...
"+" ...
"-" ...
...
"(" ...
"*" ...
"^" ...
...
...
...
...
...
...
"[" ...
"{" ...
...
位于org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:132)
位于org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:887)
位于org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:233)
…还有15个
但是当我没有在query_string字段中包含Date type字段时,一切都会正常工作。 我现在应该做什么来解决这个问题? 我在stackoverflow和Elasticsearch最终指南中未发现任何相关问题。请帮助我。

“query\u string”
中设置
“lenient”:true以忽略这些转换异常:

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

宽大

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

与精确日期搜索相关,
query\u string
视为一个特殊字符,需要进行转义。有关此内容,请参阅:

如果需要使用在查询本身中用作运算符(而不是运算符)的任何字符,则应使用前导反斜杠对其进行转义。例如,要搜索(1+1)=2,则需要将查询编写为(1+1)\=2

保留字符为:+-=&&&&&&&&&&&({}[]^“~*?:\/

“查询字符串”
中设置
“lenient”:true
,以忽略这些转换异常:

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

宽大

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

与精确日期搜索相关,
query\u string
视为一个特殊字符,需要进行转义。有关此内容,请参阅:

如果需要使用在查询本身中用作运算符(而不是运算符)的任何字符,则应使用前导反斜杠对其进行转义。例如,要搜索(1+1)=2,则需要将查询编写为(1+1)\=2

保留字符为:+-=&&&&&&&&&&&({}[]^“~*?:\/


当用户不按日期搜索时,它将解决问题。但按日期搜索不会给出任何结果。这不可能吗?这是另一个问题。可能您正在搜索不匹配的内容或您认为应该匹配的内容。不,我给出的日期有一些记录要返回。但不给出任何内容。我已按ISO date norm进行搜索在这种情况下,解析失败再次显示了这是什么格式:“'yyyy-MM-dd''T''HH:MM:ss.SSSZ”
?我尝试在意义上添加它,但它失败了。为什么不在映射中使用ES提供的其中一个格式呢?例如,
date\u-time
。您抱怨的是
“'T'
(我认为您的引号太多了)。该格式与您运行此脚本时得到的格式相同。var date=new date();echo d.toISOString()。很抱歉,这是我的错误,查询是按日期搜索的。当我这样搜索“从6月6日到6月8日”它可以工作。我认为不可能在es中按特定日期搜索?是吗?如果用户不按日期搜索,它会解决问题。但按日期搜索不会给出任何结果。不可能吗?这是另一个问题。可能你正在搜索不匹配的内容,或者你认为应该匹配。不,我给出的是有一些匹配的日期记录返回。但不提供任何内容。我通过提供ISO date normal date搜索了所有内容。在这种情况下,解析失败再次显示这是什么格式的
“格式”:“yyy-MM-dd''T''HH:MM:ss.SSSZ”
?我试着在某种意义上添加它,但失败了。为什么不在映射中使用ES提供的一个呢?例如
date\u time
。您抱怨的是
“'t'”
(我认为您在那里有太多引号)。该格式与运行此脚本时得到的格式相同。var date=new date();echo d.toISOString()。很抱歉,这是我的错误,查询是按日期搜索的..当我这样搜索“从6月6日到6月8日”它可以工作。我认为不可能在es中按特定日期搜索?是吗?如果用户不按日期搜索,它会解决问题。但按日期搜索不会给出任何结果。不可能吗?这是另一个问题。可能你正在搜索不匹配的内容,或者你认为应该匹配。不,我给出的是有一些匹配的日期记录返回。但不提供任何内容。我通过提供ISO date normal date搜索了所有内容。在这种情况下,解析失败再次显示这是什么格式的
“格式”:“yyy-MM-dd''T''HH:MM:ss.SSSZ”
?我试着在某种意义上添加它,但失败了。为什么不在映射中使用ES提供的一个呢?例如
date_