“我的索引”具有一个text类型的属性,但该属性实际上是nums,例如“ 44564”“ 4567”。 我的问题是如何比较此属性?例如“ 44564”>“ 4567”
答案 0 :(得分:1)
您要查找的内容可以通过painless
脚本来实现。您可以阅读有关here的更多信息。
我创建了带有字段name
和postcode
的映射的示例索引。
我创建的query
将列出John
区域中postcode
大于postcode
的{{1}}姓名的人
30500
{
"testindex": {
"mappings": {
"mydocuments": {
"properties": {
"name": {
"type": "text"
},
"postcode": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
在下面的查询中,您可以使用POST testindex/mydocuments/1
{
"postcode": "30005",
"name": "John"
}
POST testindex/mydocuments/2
{
"postcode": "31000",
"name": "John Doe"
}
POST testindex/mydocuments/3
{
"postcode": "32000",
"name": "John Wright"
}
而不是postcode
,但是您需要为postcode.keyword
设置"fieldata": true
,它是文本类型。
postcode
以上POST testindex/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "john"
}
},
"filter": {
"bool" : {
"must" : {
"script" : {
"script" : {
"inline" : "Integer.parseInt(doc['postcode.keyword'].value) > params.param1",
"lang" : "painless",
"params" : {
"param1" : 30500
}
}
}
}
}
}
}
}
}
所做的只是在查询执行时将query
转换为text
,从而计算出过滤器逻辑。
请注意,对于每个文档,它将如何将文本解析为Integer并由此执行查询。很明显,如果您最终拥有数百万个文档,则查询性能会受到很大的影响。
我建议您更改类型为integer
的邮政编码的映射,并相应地执行过滤功能。但是,如果您没有选择和/或使用第3方数据,我希望上面的查询就足够了。