Как запросить ключевое слово во вложенном поле, которое может быть целочисленным значением в ElasticSearch? - PullRequest
0 голосов
/ 28 февраля 2020

Это пример поля в документе ES. Как я могу запросить «values.value», которые могут быть только целыми числами?

В этом случае значение равно «150,99» и может быть полностью преобразовано в целое число. Но иногда в тексте может быть что-то вроде «значение»: «много», и я хочу исключить документ с этими значениями.

 "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», и, вероятно, я хочу исключить эти значения до ..

1 Ответ

1 голос
/ 28 февраля 2020

Вы можете использовать безболезненный скрипт, чтобы проверить, можно ли преобразовать значение в число.

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