ElasticSearch中如何查询可以为整型值的关键字嵌套字段?
How to query keyword nested field that can be an integer values in ElasticSearch?
这是ES文档中的字段示例。我如何查询只能是整数的'prices.value'?
在本例中,值为“150.99”,可以完全转换为整数。但有时可以是类似 "value": "a lot" 的文本,我想排除具有此值的文档。
"prices": [
{
"currency": "RUR",
"id_offer": 605994811,
"id_prcdoc": 42172,
"id_prcknd": 20859,
"info": {},
"min_order": null,
"sell_by": null,
"value": "150.99"}]
该字段的索引:
"prices": {
"type": "nested",
"properties": {
"currency": {
"type": "keyword"
},
"id_offer": {
"type": "integer"
},
"id_prcdoc": {
"type": "integer"
},
"id_prcknd": {
"type": "integer"
},
"min_order": {
"type": "keyword"
},
"sell_by": {
"type": "keyword"
},
"value": {
"type": "keyword",
"index": false
}
}
}
有时 'value' 字段可以是“0.00”,可能我想将此值排除在..
您可以使用无痛脚本来检查值是否可以转换为数字。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "prices",
"query": {
"script": {
"script": "if(doc['prices.value'].size()==0){return false;}if(doc['prices.value'].value=='0.00'){return false;}try{ Double.parseDouble(doc['prices.value'].value); return true;} catch(Exception e){return false;} "
}
},
"inner_hits": {}
}
}
]
}
}
}
结果将在 inner_hit 中。由于脚本很慢,最好在索引时解决它。我们可以创建另一个字段,只有价格值为数字时才会有值,并且在查询中可以使用该字段
编辑:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "prices",
"query": {
"bool": {
"must": [
{
"regexp": {
"prices.value": "[1-9][0-9]*.*[0-9]*"
}
}
]
}
},
"inner_hits": {}
}
}
]
}
}
}
这是ES文档中的字段示例。我如何查询只能是整数的'prices.value'?
在本例中,值为“150.99”,可以完全转换为整数。但有时可以是类似 "value": "a lot" 的文本,我想排除具有此值的文档。
"prices": [
{
"currency": "RUR",
"id_offer": 605994811,
"id_prcdoc": 42172,
"id_prcknd": 20859,
"info": {},
"min_order": null,
"sell_by": null,
"value": "150.99"}]
该字段的索引:
"prices": {
"type": "nested",
"properties": {
"currency": {
"type": "keyword"
},
"id_offer": {
"type": "integer"
},
"id_prcdoc": {
"type": "integer"
},
"id_prcknd": {
"type": "integer"
},
"min_order": {
"type": "keyword"
},
"sell_by": {
"type": "keyword"
},
"value": {
"type": "keyword",
"index": false
}
}
}
有时 'value' 字段可以是“0.00”,可能我想将此值排除在..
您可以使用无痛脚本来检查值是否可以转换为数字。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "prices",
"query": {
"script": {
"script": "if(doc['prices.value'].size()==0){return false;}if(doc['prices.value'].value=='0.00'){return false;}try{ Double.parseDouble(doc['prices.value'].value); return true;} catch(Exception e){return false;} "
}
},
"inner_hits": {}
}
}
]
}
}
}
结果将在 inner_hit 中。由于脚本很慢,最好在索引时解决它。我们可以创建另一个字段,只有价格值为数字时才会有值,并且在查询中可以使用该字段
编辑:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "prices",
"query": {
"bool": {
"must": [
{
"regexp": {
"prices.value": "[1-9][0-9]*.*[0-9]*"
}
}
]
}
},
"inner_hits": {}
}
}
]
}
}
}