Как я могу исправить это исключение ElasticSearch Fielddata в коде Java? - PullRequest
0 голосов
/ 15 мая 2018

Я работаю над кодом Java для создания индекса и запроса к ElasticSearch.Я получаю это исключение, когда пытаюсь использовать счетчик, сортировка API:

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true ......

Как я могу задать для Fielddata значение true?

Я использовал BulkRequest для создания индекса, как я могу добавить отображение вBulkRequest?

Вот код для создания индекса:

BulkRequest request=new BulkRequest();

    try {
        BufferedReader br=new BufferedReader(new FileReader(fileName));
        String line;
        while((line=br.readLine())!=null) {
            request.add(new IndexRequest(indexName, type).source(line, XContentType.JSON)); ;
            BulkResponse bulkresp=client.bulk(request);
            afterBulk(request,bulkresp);
        }
        catch (IOException e) {
            e.printStackTrace();
        }

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Спасибо, что ответили на мой вопрос.Я хотел отсортировать поле даты, но я не добавил отображение в индекс, все поля были автоматически переведены в текст.После добавления сопоставления в индекс проблема была решена.

0 голосов
/ 16 мая 2018

Прежде всего, давайте перейдем к источнику проблемы, вы хотите выполнить операцию сортировки текстового поля, для чего требуется, чтобы вы включили fielddata.

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

Текстовое поле анализируется перед индексацией, чтобы можно было найти значение типа Нью-Йорк , выполнив поиск new или для йорк .Агрегирование терминов в этом поле вернет новый контейнер и york , когда вам, вероятно, понадобится один контейнер с именем New York .

То же самое было бы для сортировки.Как вы предполагаете сортировать по полю, где у вас есть тонны терминов.

Вместо этого у вас должно быть поле text для полнотекстового поиска и неанализированный ключевое слово поле с doc_values ​​ включено для агрегаций, как показано ниже

{
  "mappings": {
    "_doc": {
      "properties": {
        "my_field": { 
          "type": "text",
          "fields": {
            "keyword": { 
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

К другой части вопроса - вам нужно взглянуть на CreateIndexRequest, позволяет явно указывать отображения.Скорее всего, сейчас вы используете динамические, поэтому полевые данные вызывают у вас проблемы.Подробнее о том, как использовать CreateIndexRequest - https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-create-index.html#java-rest-high-create-index

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