我的索引具有一个text类型的属性,但该属性实际上是nums,例如“44564”“4567”。
我的问题是如何比较此属性?例如“44564”>“4567”
最佳答案
您正在寻找的内容可以通过painless
脚本来实现。您可以阅读有关它们的更多信息here。
我使用映射创建了一个示例索引,该映射具有字段name
和postcode
。
我创建的query
将列出名称John
的人,这些人在postcode
区域中且postcode
大于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并由此执行查询。很明显,如果您最终拥有数百万个文档,则查询性能会受到很大的影响。
我建议您更改类型为
integer
的邮政编码的映射,并相应地执行过滤功能。但是,如果您没有选择和/或使用第3方数据,我希望上面的查询就足够了。关于elasticsearch - 如何在Elasticsearch中比较文本类型的数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52852024/