запрашивать данные изasticsearch с использованием java highlevelrestclient - PullRequest
0 голосов
/ 10 апреля 2020

Как запросить данные изasticsearch на основе свойства, которое присутствует внутри фактического объекта.

Формат данных, хранящихся в elsticsearch:

{
  "principals": [
    {
      "id": 1,
      "account": {
        "account_id": 2
      }
    }
  ]
}

Поисковый запрос в почтальоне:

{
  "query": {
    "terms": {
      "account_id": [
        1
      ]
    }
  }
}

Возвращает требуемый результат в почтальоне.

Как добиться того же в java, используя highlevelrestclient.

1 Ответ

0 голосов
/ 10 апреля 2020

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

Но я проиндексировал и провел поиск вашего документа следующим образом:

mapping:

{
  "mappings": {
    "properties": { 

      "principals": { 
        "properties": {
          "id":  { "type": "integer" },
          "account": { 
            "properties": {
              "account_id": { "type": "integer" }

            }
          }
        }
      }
    }
  }
}

поисковый запрос:

 {
  "query": {
    "terms": {
      "principals.account.account_id": [2]
    }
  }
}

Результат поиска:

"hits": [
  {
    "_index": "nestedindex",
    "_type": "_doc",
    "_id": "2",
    "_score": 1.0,
    "_source": {
      "principals": [
        {
          "id": 1,
          "account": {
            "account_id": 2
          }
        }
      ]
    }
  }
]

Поисковый запрос через Elasticsearch Resthighlevelclient

SearchRequest searchRequest = new SearchRequest("testIndex"); //in place of "testIndex" you can give your index name
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
List<Integer> accountIds = new ArrayList<Integer>();
accountIds.add(2);
sourceBuilder.query(QueryBuilders.termsQuery("principals.account.account_id", accountIds)); 
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); 
searchRequest.source(sourceBuilder);
SearchResponse searchResponse =   
                client.search(searchRequest, RequestOptions.DEFAULT);  //client is ES client

return searchResponse; //you can read your hits through searchResponse.getHits().getHits()

Клиент ElasticSearch может быть создан при весенней загрузке приложение, создав файл конфигурации в вашем проекте и автоматически подключив клиента, где это необходимо:

@Configuration
@Primary
public class ElasticsearchConfig {

    private RestHighLevelClient restHighLevelClient;

    @Bean(destroyMethod = "close")
    public RestHighLevelClient client() {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        return client;

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