如何检查数字范围以及Elasticsearch中的字符串值?

时间:2014-07-07 12:14:59

标签: elasticsearch

我有一个实体给出目录大小的情况,如果它存在,否则它给出一个字符串说" IATEMPDIR不存在"。

有没有办法确定实体client.tempsize是否65594&& client.tempsize值不是字符串(因此当它具有IATEMPDIR does not exist值时,它也应该返回此查询)。在这种情况下,如何检查数字范围以及如果字符串

我正在使用渗透

PUT /eg/.percolator/1
{   
    "sort": {
        "rule.step": { "order": "asc" }
    },
    "query": {
        "filtered": {
           "query": {
               "bool": {
                   "must": [
                      {
                          "match": {
                             "client.name": "Athena"
                          }
                      },
                      {
                          "range": {
                             "client.tempsize": {
                                    "lt": 65594
                             }
                          }
                      }
                    ]                   
               }               
           }
        }
    },
    "rule": {
        "ruledesc": "Client should be Athena & tempsize should have sufficient space (eg: > 65594) and should not be a string",
        "step": 1
    }    
}

我的文档

GET /eg/message/_percolate
{
    "doc": {
        "client": {
            "name": "Athena",
            "tempsize": "IATEMPDIR does not exist"
        }
    }
}

上面的文档给了我...MapperParsingException[failed to parse [client.tempsize]]; nested: NumberFormatException...,但是当我使用"tempsize": 12时,它会给出正确的结果。

{
   "took": 3,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "total": 1,
   "matches": [
      {
         "_index": "eg",
         "_id": "1"
      }
   ]
}

更新

经过 ppearcy 的回答。我将映射更改为

PUT /eg/message/_mapping
{
   "properties": {
      "client": {
         "properties": {
            "name": {
               "type": "string"
            },
            "tempsize": {
               "type": "long",
               "ignore_malformed" : "true"
            }
         }
      }
   }
}

并且以下doc不会导致我的查询,并且忽略字符串

GET /eg/message/_percolate
{
    "doc": {
        "client": {
            "name": "Athena",
            "tempsize": "IATEMPDIR does not exist"
        }
    }
}

所以,如果我给"tempsize": "65594",是否考虑双引号内的数字(因为给出小于65594的数字会回复我的查询)?或者它会在某个地方破裂?

1 个答案:

答案 0 :(得分:1)

您应该在字段的映射上设置“ignore_malformed”:“true”。

这将允许您仍然索引文档和非数字将被忽略,并且可以使用缺失/存在的查询类型进行查询。

使用lucene查询语法来简化,您的最终查询将如下所示:

_missing_:client.tempsize OR client.tempsize:[0 TO 65594]

请查看此处的号码部分以获取更多信息: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html