ElasticSearch Сделать поле недоступным для поиска с java - PullRequest
1 голос
/ 20 марта 2020

Я сейчас работаю над elasti c поиск в моем java приложении. Я знаю, как индексировать Java pojo, используя RestHighLevelClient. Как я могу сделать поиск только по новым полям, а не по полной? java. Помогите, пожалуйста, или хорошая ссылка?

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Написание другого ответа для RestHighLevelClient Поскольку другой ответ полезен для людей, не использующих клиент Rest, и добавление этого в первый ответ делает его слишком длинным.

Примечание: вы передаете type, который устарел в ES 7.X, и я использую версию ES 7.X, поэтому мой код соответствует 7.X.

        CreateIndexRequest request = new CreateIndexRequest("employee");
        Map<String, Object> name = new HashMap<>();
        name.put("type", "text");
        Map<String, Object> address = new HashMap<>();
        address.put("type", "text");
        address.put("index", false);

        Map<String, Object> properties = new HashMap<>();
        properties.put("name", name);
        properties.put("address", address);
        Map<String, Object> mapping = new HashMap<>();
        mapping.put("properties", properties);
        request.mapping(mapping);
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);

Важные пункты

  • Я использовал только 2 поля для иллюстрации, одно из которых - поле address, которое не доступно для поиска, и для этого я использовал address.put("index", false);, тогда как name - это поле для поиска, и там есть эта опция отсутствует.
  • Я создал index mapping, используя метод Map, который доступен в этом официальном ES do c.
  • , вы можете проверить отображение, созданное этим кодом с использованием mapping REST API .
  • Ниже приведено отображение, сгенерированное для этого кода в моей системе, и вы можете видеть, что index: false добавлено в поле адреса.
{
  "employee": {
    "mappings": {
      "properties": {
        "address": {
          "type": "text",
          "index": false
        },
        "name": {
          "type": "text"
        }
      }
    }
  }
}
  • Вы можете просто использовать тот же поиск JSON мужчины в предыдущем ответе, чтобы проверить, что это не для поиска.
1 голос
/ 21 марта 2020

Используйте параметр индекса в качестве значения false в поле адреса, которое по умолчанию равно true, чтобы сделать его недоступным для поиска. Как упомянуто в той же официальной ссылке ES:

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

Позвольте мне показать вам, как вы можете протестировать его, используя REST API, а затем код java (используя клиент высокого уровня покоя) для достижения * 1029. * it.

Отображение

{
    "mappings": {
        "properties": {
            "id": {
                "type": "long"
            },
            "name": {
                "type": "text"
            },
            "designation": {
                "type": "text"
            },
            "address": {
                "type": "text",
                "index" : false --> made `index` to false
            }
        }
    }
}

Индексировать несколько документов

{
    "address" : "USA",
    "name"  : "Noshaf",
    "id" :  234567892,
    "designation" : "software engineer"
}

{
    "address" : "USA california state",
    "name"  : "opster",
    "id" :  234567890,
    "designation" : "software engineer"
}

Простой поисковый запрос на совпадение в формате JSON в address поле

{
    "query": {
        "match" : {
            "address" : "USA"
        }
    }
}

Исключение из Elasticsearch четко упомянуто, оно не доступно для поиска

"reason_by": {"type": "invalid_argument_exception", "reason": " Невозможно выполнить поиск по полю [address ], поскольку не проиндексировано. " }

...