Агрегировать результаты на основе 3 разных запросов elasticsearch - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 3 разных поисковых запроса из разных источников, я хочу объединить эти запросы в один запрос, который вернет результаты, которые являются объединением этих 3 запросов (операция ИЛИ для запроса)

Для пример:

Запрос 1:

query: {
  bool: {
    filter: [
      { terms: { tags.keyword: ['apple', 'banana'] }},
      { terms: { language.keyword: ['en'] }},
    ]
  }
}

Запрос 2:

query: {
  bool: {
    filter: [
      { terms: { tags.keyword: ['orange', 'mango'] }},
      { terms: { language.keyword: ['it'] }}, 
      { terms: { source.keyword: ['Royal Garden'] }},
    ]
  }
}

Запрос 3:

query: {
  bool: {
    filter: [
      { terms: { owner.keyword: ['Dan Chunmun'] }},
      { terms: { language.keyword: ['en'] }}, 
      { terms: { source.keyword: ['Royal Garden'] }},
    ]
  }
}

Что нужно искать результат:

Результат = Запрос 1 ИЛИ Запрос 2 ИЛИ Запрос 3 (Объединение всех 3 запросов)

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

Я попытался объединить bool часть запросов выше, например:

const boolTerms: any = [];

Queries.map(q => {
  return boolTerms.push(q.query);
});

// combined query
filter : {
  bool: {
    should: boolTerms  
  }
}

1 Ответ

0 голосов
/ 04 августа 2020

Существует два способа объединения запросов.

  1. Запрос строки запроса предназначен только для этих случаев использования. В запросе строки запроса вы можете записать каждый запрос в строковом формате

Позвольте определить предложение A = tags.keyword: ['apple', 'banana']

Теперь вы можете комбинировать несколько:

{
  "query": {
    "query_string": {
      "query": "(A and B) OR (D and E and F) or(G and H and E)"
    }
  }
}

Здесь A и B - это все предложения запроса 1.

Но поскольку запрос строки запроса является полнотекстовым запросом, и анализаторы будут применяться к условиям запроса, поэтому для вашего случая будет использоваться запрос типа bool, в котором вы также можете комбинировать запросы tern

Вот пример

{
  "query": {
    "bool": {
     "should": [
       {
        "bool": {
          "must": [
            {
              "terms": {
                "tags.keyword":  ["apple", "banana"]
              }
            },
            {
              "terms": {
                "language.keyword":  ["en"]
              }
            }
          ]
        }
       },
       {
        "bool": {
          "must": [
            {
              "terms": {
                "tags.keyword":  ["orange", "banana"]
              }
            },
            {
              "terms": {
                "language.keyword":  ["it"]
              }
            }
          ]
        }
       }
     ]
    }
  }
}
...