如何在elasticseach中比较文本类型的数量

时间:2018-10-17 09:54:18

标签: elasticsearch

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

1 个答案:

答案 0 :(得分:1)

您要查找的内容可以通过painless脚本来实现。您可以阅读有关here的更多信息。

我创建了带有字段namepostcode的映射的示例索引。

我创建的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方数据,我希望上面的查询就足够了。