【问题标题】:How to query keyword nested field that can be an integer values in ElasticSearch?如何在 ElasticSearch 中查询可以是整数值的关键字嵌套字段?
【发布时间】:2020-02-28 07:37:28
【问题描述】:

这是 ES 文档中的字段示例。我如何查询只能是整数的“prices.value”?

在这种情况下,值为“150.99”,可以完全转换为整数。但有时 in 可以是类似 "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
          }
        }
      }

有时它的“值”字段可以是“0.00”,可能我想将此值排除在...

【问题讨论】:

    标签: elasticsearch elasticsearch-query elasticsearch-nested


    【解决方案1】:

    您可以使用无痛脚本来检查值是否可以转换为数字。

    {
      "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": {}
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 这有点贵,但无论如何,谢谢,我会尝试一下)
    • 我添加了一个编辑以使用正则表达式 m 将比脚本更好的性能
    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2017-09-17
    • 2014-12-28
    • 2020-10-10
    相关资源
    最近更新 更多