RemoteTransportException, Fielddata отключается в текстовых полях при выполнении агрегации в текстовом поле

Я перехожу с 2.x на 5.x Я добавляю значения в индекс, как это

indexInto (indexName / indexType) id someKey source foo

Однако я также хотел бы получить все значения по полю:

 def getValues(tag: String) ={
client execute {
search(indexName / indexType) query ("_field_names", tag) aggregations (termsAggregation( "agg") field tag size 1)
}

Но я получаю это исключение:

RemoteTransportException [[8vWOLB2] [172.17.0.5:9300] [индексы: данные / чтение / поиск [фаза / запрос]]]; nested: IllegalArgumentException[Fielddata отключен для текстовых полей по умолчанию. Установите fielddata=true на [my_tag], чтобы загрузить полевые данные в память, инвертировав инвертированный индекс. Обратите внимание, что для этого может потребоваться значительная память.];

Я думаю, может быть, использовать keyword как показано здесь, но поля не известны заранее (отправлено пользователем), поэтому я не могу использовать сопоставления perpend

1 ответ

Решение

По умолчанию все неизвестные поля будут проиндексированы / добавлены в asticsearch в виде текстовых полей, которые не указаны в отображениях. Если вы посмотрите на сопоставления такого поля, вы увидите, что поле включено для таких полей с типом "ключевое слово", и эти поля проиндексированы, но не проанализированы.

GET new_index2/_mappings
{
  "new_index2": {
    "mappings": {
      "type": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

так что вы можете использовать значения полей для текстовых полей для агрегатов, как показано ниже

POST new_index2/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field": "name.fields",
        "size": 10
      }
    }
  }
}

Проверьте name.fields

Таким образом, ваш запрос Scala может работать, если вы можете перейти к значению поля.

def getValues(tag: String) = {
   client.execute {
      search(indexName / indexType)
        .query("_field_name", tag)
        .aggregations {
           termsAgg("agg", "field_name.fields")
        }.size(1)
   }
}

Надеюсь это поможет. Спасибо

Другие вопросы по тегам