Как сравнить число типов текста в эластичном - PullRequest
0 голосов
/ 17 октября 2018

Мой индекс имеет свойство текстового типа, но на самом деле это свойство равно nums, например, "44564", "4567".Мой вопрос, как можно сравнить это свойство?как "44564"> "4567"

1 Ответ

0 голосов
/ 18 октября 2018

То, что вы ищете, может быть достигнуто с помощью скрипта painless.Вы можете прочитать больше о них здесь .

Я создал образец индекса с отображением, имеющим поля 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, который имеет тип text.

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, и соответственно выполнить функцию фильтрации.Однако, если у вас нет выбора и / или использования сторонних данных, я надеюсь, что вышеуказанного запроса будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...