我的索引具有一个text类型的属性,但该属性实际上是nums,例如“44564”“4567”。
我的问题是如何比较此属性?例如“44564”>“4567”

最佳答案

您正在寻找的内容可以通过painless脚本来实现。您可以阅读有关它们的更多信息here

我使用映射创建了一个示例索引,该映射具有字段namepostcode

我创建的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/

10-09 06:54