ElasticSearch — как быстро запросить один результат из 30 миллионов документов

#java #elasticsearch

#java #elasticsearch

Вопрос:

Теперь ситуация такова, что мы хотим выполнить поиск 3 миллиона раз из ElasticSearch за короткое время. Для тестирования мы настроили один Es-кластер с 4-ядерным процессором и 16 ГБ памяти.А это займет около 8 часов. Запрос, который мы используем, это:

  GET XXX/TYPE/_search
{
"query": {
"match": {
     "poiName": {
       "query": "XXXXX"
       , "operator": "or"
     }
    }
   }
}
 

И мы используем java http-запрос для запроса ElasticSearch с помощью hadoop.

         URL url = new URL(searchUrl);
        con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        con.setDoInput(true);

        OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream());
        String query = getQueryJson(field,value);
        wr.write(query);
        wr.flush();
        int HttpResult =con.getResponseCode();
        if(HttpResult ==HttpURLConnection.HTTP_OK){
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"utf-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line   "n");
            }

            br.close();

        }
 

На самом деле, нам нужен только один ответ на результат.Как я могу это улучшить?

=================== обновление===============================

Для моей задачи :

Документ выглядит примерно так {«doc_name»:»An Foo Eoo», «name_id:123456», «other filed»:»значение»}.

Мы запрашиваем «Ann Foo Eoo» из ES, чтобы получить name_id, но нам не нужны все хиты.

Мы запросим 3 миллиона разных doc_name из ElasticSearch.

На самом деле, нам нужен только максимальный результат матча, и нам все равно, какой будет счет. Приложите мой запрос условий .Значение minimum_match зависит от размера poiName.

(ps. minimum_match = Math.ceil(размер терминов в poiName) / 2 )

 GET XXX/TYPE/_search
{
  "query": {
    "terms": {
      "poiName": [
        "An",
        "Foo",
        "Eoo"
      ],
      "minimum_match":2
    }
  }

}
 

Комментарии:

1. это что-то вроде «поиска по 3 разным миллионам терминов» в моем индексе?

2. Да, мы будем искать 3 разных миллиона терминов

3. не могли бы вы объяснить свою задачу более широко? если вы запрашиваете строку из 3 миллионов терминов, она возвращает документы, отсортированные по количеству баллов. Вам это нужно? или вы хотите просто фильтровать документы по определенным условиям. Может быть, можно денормализовать вашу структуру и создать что-то вроде «группы терминов», «супергруппы терминов», чтобы уменьшить количество применимых терминов?

4. Хорошо, я объясню свою задачу и обновлю свой запрос term