我有一个实体给出目录大小的情况,如果它存在,否则它给出一个字符串说" 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的数字会回复我的查询)?或者它会在某个地方破裂?
答案 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