Запрос диапазона для вложенных документов по типу ключевого слова - PullRequest
0 голосов
/ 04 мая 2020

У меня есть такая структура документа. Для этого ниже двух документов у нас есть вложенные документы, называемые информацией взаимодействия. Мне просто нужно получить только те документы, которые имеют длительность заголовка и их значение больше 60

. Здесь в поле «значение» указывается ключевое слово, а не целое число. Я знаю, что только для Integer Range будет выполнен запрос. Есть ли какой-нибудь возможный способ найти документы, длительность которых превышает 60 (безболезненный запрос или скрипт-запрос). Как преобразование поля значения в целое число, а затем поиск в документе.

{
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
      {
        "title": "duration",
        "value": "11"
      },
      {
        "title": "timetaken",
        "value": "9"
      },
      {
        "title": "talk_time",
        "value": "145"
      }
    ]
  },
  {
    "key": "f07ff9ba-36e4-482a-9c1c-d888e89f926e",
    "interactionInfo": [
      {
        "title": "duration",
        "value": "120"
      },
      {
        "title": "timetaken",
        "value": "9"
      },
      {
        "title": "talk_time",
        "value": "60"
      }
    ]
  }

1 Ответ

1 голос
/ 04 мая 2020

Я добавил сценарий для получения взаимодействияInfo.value> «somevalue». Сценарии медленные, и лучше решить эту проблему во время индекса и использовать запрос диапазона.

Индекс:

{
  "index15" : {
    "mappings" : {
      "properties" : {
        "interactionInfo" : {
          "type" : "nested",
          "properties" : {
            "title" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "value" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "key" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Запрос:

{
  "query": {
    "nested": {
      "path": "interactionInfo",
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "interactionInfo.title.keyword": {
                  "value": "duration"
                }
              }
            },
            {
              "script": {
                "script": {
                "source":"def val=Integer.parseInt(doc['interactionInfo.value.keyword'].value); if(val>params.value) return true; else return false;",
                "params": {
                  "value":10
                }
                }
              }
            }
          ]
        }
      },
      "inner_hits": {}
    }
  }
}
...