Elasti c Spring Data ИЛИ Java Клиент REST высокого уровня? - PullRequest
0 голосов
/ 24 апреля 2020

Я новичок в Elasticsearch и Spring. Я написал Javascript PO C, который преобразует строку JSON в запрос Elasticsearch (и выполняет запрос). Он принимает строку, подобную этой:

{
    "period": "years",
    "format": "xml",
    "criteria": {
        "operator": "OR",
        "operands": [
            {
                "operator": "AND",
                "operands": [
                    {
                        "operator": "exists",
                        "field": "def"
                    },
                    {
                        "operator": "includes",
                        "field": "keywords",
                        "value": [
                            "abcd"
                        ]
                    }
                ]
            },
            {
                "operator": "AND",
                "operands": [
                    {
                        "operator": "from",
                        "field": "links",
                        "value": 1
                    },
                    {
                        "operator": "includes",
                        "field": "keywords",
                        "value": [
                            "abcd",
                            "efgh"
                        ]
                    }
                ]
            }
        ]
    }
}

(Примечание. Этот запрос может иметь любой уровень вложенности)

... и преобразует его в следующее:

{
    "query": {
      "constant_score": {
        "filter": {
          "bool": {
            "should": [
              {
                "bool": {
                  "must": [
                    {
                      "bool": {
                        "must": [
                          {
                            "exists": {
                              "field": "def"
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    },
                    {
                      "bool": {
                        "must": [
                          {
                            "terms": {
                              "keywords.name": [
                                "abcd",
                                "efgh"
                              ]
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "bool": {
                        "must": {
                          "terms": {
                            "links": [
                              11048,
                              34618,
                              34658
                            ]
                          }
                        }
                      }
                    },
                    {
                      "bool": {
                        "must": [
                          {
                            "terms": {
                              "keywords.name": [
                                "abcd",
                                "efgh"
                              ]
                            }
                          },
                          {
                            "range": {
                              "effectiveDate": {
                                "gte": 1543982400,
                                "lt": 1575518400
                              }
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    },
    "size": 0,
    "aggs": {
      "by_id": {
        "composite": {
          "sources": [
            {
              "agg_on_id": {
                "terms": {
                  "field": "id"
                }
              }
            }
          ],
          "size": 10000,
          "after": {
            "agg_on_id": -1
          }
        },
        "aggs": {
          "latest_snapshot": {
            "top_hits": {
              "sort": [
                {
                  "effectiveDate": "desc"
                }
              ],
              "_source": true,
              "size": 1
            }
          }
        }
      }
    }
  }

Сначала создается запрос (аналогичный описанному выше) для первой поездки в Elasticsearch для извлечения некоторой информации («ссылок»), необходимой для построения этого запроса. Каждая поездка в Elasticsearch может возвращать миллионы результатов, поэтому она выполняет поисковый вызов с использованием механизма «search_after». Мне нужно преобразовать этот PO C в приложение Spring.

Вопрос : Какой из них наиболее подходит для этого случая - Spring Data Elasticsearch или Elasticsearch Java High Level REST Client? Похоже, Spring dataasticsearch хорошо справляется с созданием простых запросов без особых усилий, но поможет ли это мне в этом случае? Любые предложения будут высоко оценены. Спасибо!

Ответы [ 2 ]

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

Spring Data Elasticsearch использует клиента высокого уровня, предоставленного Elasticsearch для нереактивной реализации.

Вы также можете использовать построители запросов из Elasticsearch вместе с Spring Data Elasticsearch, что дает вам наибольшую гибкость.

Spring Data Elasticsearch добавляет к этому отображение сущностей (POJO на JSON), функции репозитория и другие вещи из Spring Data. Поэтому вопрос не в том, следует ли вам делать то или другое, но если вам нужно или вы хотите использовать дополнительные функции, которые предлагает Spring Data Elasticsearch.

Редактировать:

При использовании Spring Data Elasticsearch вы настраиваете используемый RestHighLevelClient (см. документацию ), а затем вводите его в другие компоненты Spring. Таким образом, вы даже можете смешивать доступ к ES с использованием Spring Data ElasticsearchOperations или репозиториев и доступ с использованием RestHighLevelClient напрямую.

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

Я бы предложил вам использовать официальный Java -высоковый клиент высокого уровня , над которым активно работают в Elasti c, и вы также можете посмотреть на все построители запросов он поддерживает (у него есть конструкторы запросов почти для всех запросов).

Раньше у Elasticsearch не было официального клиента для JAVA, но теперь, когда они активно развиваются и развиваются, ИМХО Вы должны go опередить их, поскольку они также предоставляют множество нестандартных опций, и кто понимает Elasticsearch лучше, чем компания, стоящая за ним:)

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