在elasticsearch中查询空字符串

时间:2013-12-12 12:14:07

标签: python elasticsearch

是否可以尝试在elasticsearch中查询空字符串而不会出错? 在我的情况下现在的情况是有一些单词存储在索引中,我会收到一些数据,我想用这种数据作为查询数据。我无法控制数据,因此有时数据可能是空字符串。 E.g。

query={"query":{"query_stirng":{"query":""}}}

Caused by: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '   ': Encountered "<EOF>" at line 1, column 3.
Was expecting one of:
    <NOT> ...
    "+" ...
    "-" ...
    <BAREOPER> ...
    "(" ...
    "*" ...
    <QUOTED> ...
    <TERM> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    <REGEXPTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
    <TERM> ...
    "*" ...

    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:126)
    at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:213)
    ... 15 more
Caused by: org.apache.lucene.queryparser.classic.ParseException: Encountered "<EOF>" at line 1, column 3.
Was expecting one of:
    <NOT> ...
    "+" ...
    "-" ...
    <BAREOPER> ...
    "(" ...
    "*" ...
    <QUOTED> ...
    <TERM> ...
    <PREFIXTERM> ...
    <WILDTERM> ...
    <REGEXPTERM> ...
    "[" ...
    "{" ...
    <NUMBER> ...
    <TERM> ...
    "*" ...

    at org.apache.lucene.queryparser.classic.QueryParser.generateParseException(QueryParser.java:708)
    at org.apache.lucene.queryparser.classic.QueryParser.jj_consume_token(QueryParser.java:590)
    at org.apache.lucene.queryparser.classic.QueryParser.Clause(QueryParser.java:275)
    at org.apache.lucene.queryparser.classic.QueryParser.Query(QueryParser.java:181)
    at org.apache.lucene.queryparser.classic.QueryParser.TopLevelQuery(QueryParser.java:170)
    at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:121)
    ... 16 more

可以使用elasticsearch来解决这个问题,还是必须使用代码来解决这个问题? 这样我可以使用elasticsearch接收空数据和查询,elasitcsearch不会导致任何问题吗?

环境: Ubuntu 12.04桌面64位

elasticsearch 0.90.7&gt;&gt;单节点

编程语言:python

3 个答案:

答案 0 :(得分:1)

我想在这种情况下可能会缺少过滤器:

Missing Filter

{
  "query": {
    "filtered": {
      "filter": {
        "missing": {
          "field": "user",
          "existence": true,
          "null_value": true
        }
      }
    }
  }
}

答案 1 :(得分:0)

我想现在不可能。您需要使用一些try-catch机制(异常处理)在代码中处理它。

答案 2 :(得分:0)

我遇到了包含空字符串值的字符串字段的类似问题。使用查询DSL,我设法通过使用以下方式获取空字符串:(如果文档包含&#34;字段&#34;:&#34;&#34;)

 "query": {
       "query_string": {
          "query": "( _exists_:field && -field:* )"                 
       }
   }

这基本上意味着,&#34;字段不为空,并且它不是任何字符串&#34;。

同样,排除空字符串将是:

   "query": {
       "query_string": {
          "query": "( _missing_:field || field:* )"                 
       }
   }

表示&#34;字段为空或任何字符串&#34;。