Невозможно вставить index:not_analyzed в отображение elasticsearch 6.1.2

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

        HashMap<String, String> data = new HashMap<String, String>();
        data.put("GroupId", "3");
        data.put("GroupName", "testGroup three");
        data.put("CreatedDateTime", "20180115130026757+0000");
        data.put("UpdatedDateTime", "20180115130026757+0000");
        data.put("Createdby", "3");
        data.put("GroupUser",  "{1,2,3,4}");
        data.put("status", "active");

        String mapping = {"typename":{"properties":{
        "GroupName":{"type":"text","index":"not_analyzed"},
        "Createdby":{"type":"text","index":"not_analyzed"},
        "GroupUser":{"type":"text","index":"not_analyzed"},
        "UpdatedDateTime":{"type":"text","index":"not_analyzed"},
        "CreatedDateTime":{"type":"text","index":"not_analyzed"},
        "GroupId":{"type":"text","index":"not_analyzed"},
        "status":{"type":"text","index":"not_analyzed"}}}}

        client = new PreBuiltTransportClient(settings).addTransportAddresses(new TransportAddress(new InetSocketAddress(ipaddress, port)));

        //inserting record
        IndexResponse response = client.prepareIndex(indexName, typeName).setSource(data).get();

        //inserting mapping
        client.admin().indices().preparePutMapping(indexName)
        .setType("typeName")
        .setSource(mapping, XContentType.JSON)
        .get();

Чтобы найти значение с учетом регистра, я обнаружил, что использовать индекс как not_analyzed. Я попробовал следующее

        HashMap<String, String> data = new HashMap<String, String>();
        data.put("GroupId", "3");
        data.put("GroupName", "testGroup three");
        data.put("CreatedDateTime", "20180115130026757+0000");
        data.put("UpdatedDateTime", "20180115130026757+0000");
        data.put("Createdby", "3");
        data.put("GroupUser",  "{1,2,3,4}");
        data.put("status", "active");

        String mapping = {"typename":{"properties":{
        "GroupName":{"type":"text","index":"not_analyzed"},
        "Createdby":{"type":"text","index":"not_analyzed"},
        "GroupUser":{"type":"text","index":"not_analyzed"},
        "UpdatedDateTime":{"type":"text","index":"not_analyzed"},
        "CreatedDateTime":{"type":"text","index":"not_analyzed"},
        "GroupId":{"type":"text","index":"not_analyzed"},
        "status":{"type":"text","index":"not_analyzed"}}}}

        client = new PreBuiltTransportClient(settings).addTransportAddresses(new TransportAddress(new InetSocketAddress(ipaddress, port)));

        //inserting record
        IndexResponse response = client.prepareIndex(indexName, typeName).setSource(data).get();

        //inserting mapping
        client.admin().indices().preparePutMapping(indexName)
        .setType("typeName")
        .setSource(mapping, XContentType.JSON)
        .get();

Я получаю исключение, как показано ниже

 java.lang.IllegalArgumentException: Could not convert [GroupName.index] to boolean

Я хочу выполнить два сценария ниже:

 1. Find by case sensitive
 2. Find by case insensitive.

Версия эластичного поиска — 6.1.2.

Любая помощь очень ценится.

ОБНОВЛЕНИЕ-1

Согласно @Val, я изменил код на:

    HashMap<String, String> data = new HashMap<String, String>();
    data.put("GroupId", "3");
    data.put("GroupName", "testGroup three");
    data.put("CreatedDateTime", "20180115130026757+0000");
    data.put("UpdatedDateTime", "20180115130026757+0000");
    data.put("Createdby", "3");
    data.put("GroupUser",  "{1,2,3,4}");
    data.put("status", "active");

    String mapping = {"typename":{"properties":{
    "GroupName":{"type":"keyword"},
    "Createdby":{"type":"keyword"},
    "GroupUser":{"type":"keyword"},
    "UpdatedDateTime":{"keyword":"text"},
    "CreatedDateTime":{"keyword":"text"},
    "GroupId":{"type":"keyword"},
    "status":{"type":"keyword"}}}}

    client = new PreBuiltTransportClient(settings).addTransportAddresses(new TransportAddress(new InetSocketAddress(ipaddress, port)));

   client.admin().indices().prepareCreate("indexName").get(); 

    //inserting mapping
    client.admin().indices().preparePutMapping(indexName)
    .setType("typeName")
    .setSource(mapping, XContentType.JSON)
    .get();

    //inserting record
    IndexResponse response = client.prepareIndex(indexName, typeName).setSource(data).get();

Теперь я могу вставить. Но когда я ищу значение a в GroupName, результат пуст.


person Raviteja Gannoju    schedule 20.02.2018    source источник
comment
Также вы можете обновить свой вопрос тем, что у вас есть в переменной data?   -  person Val    schedule 20.02.2018
comment
@Val Я обновил свой вопрос для переменной данных.   -  person Raviteja Gannoju    schedule 20.02.2018
comment
Хорошо, тогда попробуйте мой ответ ниже, но сначала обязательно удалите свой индекс :-)   -  person Val    schedule 20.02.2018


Ответы (1)


not_analyzed устарел, вместо него нужно использовать keyword.

Вместо этого попробуйте это сопоставление ниже:

String mapping = {
  "typename": {
    "properties": {
      "GroupName": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "Createdby": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "GroupUser": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "UpdatedDateTime": {
        "type": "date",
        "format": "yyyyMMddHHmmssSSSZ"
      },
      "CreatedDateTime": {
        "type": "date",
        "format": "yyyyMMddHHmmssSSSZ"
      },
      "GroupId": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "status": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Также не забудьте поставить сопоставление перед вставкой данных, т.е.

выполнять:

//inserting mapping

до:

//inserting record
person Val    schedule 20.02.2018
comment
Пожалуйста, проверьте мой обновленный вопрос. Когда я попробовал тип как ключевое слово. Я вижу другую ошибку, говорящую mapper [CreatedDateTime] of different type, current_type [text], merged_type [keyword] - person Raviteja Gannoju; 20.02.2018
comment
не забудьте сначала удалить свой индекс - person Val; 20.02.2018
comment
Я сделал, это то же самое - person Raviteja Gannoju; 20.02.2018
comment
Сопоставление ваших полей даты неверно. Смотрите мой обновленный ответ - person Val; 20.02.2018
comment
Если я делаю сопоставление перед индексацией, я получаю ошибку no such index. - person Raviteja Gannoju; 20.02.2018
comment
Позвоните client.admin().indices().prepareCreate("indexName").get(); до putMapping. Или вы можете сделать это за один раз вот так - person Val; 20.02.2018
comment
Вставка выполнена успешно, но когда я ищу работу в имени группы, она не возвращает значения. Для имени группы, например, имя группы — это «Общая группа», и когда я ищу «Общие», он возвращает 0 для запроса соответствия. - person Raviteja Gannoju; 20.02.2018
comment
Это большой шаг вперед. теперь покажите свой запрос, пожалуйста - person Val; 20.02.2018
comment
{ bool : { must : [ { match : { GroupName : { query : General } } } ], } } - person Raviteja Gannoju; 20.02.2018
comment
Поскольку вам нужен точный поиск, вы должны искать General Group (с тем же регистром), иначе он не будет работать, в этом вся цель типа keyword, значение вообще не анализируется (т.е. не токенизировано, не в нижнем регистре и т. д.). - person Val; 20.02.2018
comment
но наше требование состоит в том, чтобы найти оба 1. Найти с учетом регистра 2. Найти без учета регистра. наряду с полным совпадением и частичным совпадением значений - person Raviteja Gannoju; 21.02.2018
comment
Из вашего вопроса ничего не было ясно. Тогда сопоставление немного отличается, см. мой обновленный ответ. Затем вы можете выполнять поиск без учета регистра в поле GroupName и поиск с учетом регистра в поле GroupName.keyword. - person Val; 21.02.2018
comment
Можете ли вы предложить мне, как проверить существование индекса перед созданием индекса с использованием высокоуровневого клиента в настоящее время, который у меня был с помощью elasticsearch 6.1.3 - person Raviteja Gannoju; 22.02.2018
comment
Для тех, кто заинтересован, новый вопрос/ответ находится здесь: stackoverflow.com/questions/48927002/ - person Val; 22.02.2018