ElasticSearch поиск нескольких терминов JSON - PullRequest
0 голосов
/ 14 мая 2019

У меня есть тонна предметов в БД со многими столбцами.Мне нужно выполнить поиск по двум из этих столбцов, чтобы получить один набор данных.В первом столбце, genericCode, будут сгруппированы все строки, имеющие этот код.Второй столбец, genericId, вызывает конкретную строку для добавления, поскольку в ней отсутствует список genericCode, который я ищу.

Внутренний C # настраивает мой json для меня следующим образом, но ничего не возвращает.

{
  "from": 0,
  "size": 50,
  "aggs": {
    "paramA": {
      "nested": {
        "path": "paramA"
      },
      "aggs": {
        "names": {
          "terms": {
            "field": "paramA.name",
            "size": 10
          },
          "aggs": {
            "specValues": {
              "terms": {
                "field": "paramA.value",
                "size": 10
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "locationId": {
              "value": 1
            }
          }
        },
        {
          "terms": {
            "genericCode": [
              "10A",
              "20B"
            ]
          }
        },
        {
          "terms": {
            "genericId": [
              11223344
            ]
          }
        }
      ]
    }
  }
}

Я получаю и пустой набор результатов.Если я уберу любой из "terms", я получу то, что ожидал.Итак, мне просто нужно объединить эти термины в один поиск.

Я просмотрел здесь много документации: https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html и до сих пор не могу найти то, что ищу.

Допустим, яJelly Belly и я хотим создать пакет желейных бобов со всеми желейными бобами «Звездных войн» и «Дисней», а также добавить все бобы зеленого цвета.Это в основном то, что я пытаюсь сделать.

РЕДАКТИРОВАТЬ: Изменение "must" на «следует» тоже не совсем правильно.Мне нужно, чтобы это было (в псевдо sql):

SELECT *
FROM myTable
Where locationId = 1
AND (
  genericCode = "this", "that
  OR
  genericId = 1234, 5678
  )

locationId разделяет наши данные важным способом.

Я нашел это сообщение: Объединение запросов в Flexiblesearch bool должно с ИЛИ , и оно приблизило меня, но не до конца ...

Я пробовалнесколько итераций следует> должен> должен> создать этот запрос и получить разные результаты, но ничего точного.

1 Ответ

0 голосов
/ 14 мая 2019

Вот запрос, который работает. Это помогло, когда я понял, что передал неверные данные для одного из моих параметров. DOH

Вложите should в must, как @khachik отметил в комментарии выше. Я имел это некоторое время назад, но это не работало из-за вышеупомянутой ошибки.

{
  "from": 0,
  "size": 10,
  "aggs": {
    "specs": {
      "nested": {
        "path": "paramA"
      },
      "aggs": {
        "names": {
          "terms": {
            "field": "paramA.name",
            "size": 10
          },
          "aggs": {
            "specValues": {
              "terms": {
                "field": "paramA.value",
                "size": 10
              }
            }
          }
        }
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "locationId": {
              "value": 1
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "terms": {
                  "genericCode": [
                    "101",
                    "102"
                  ]
                }
              },
              {
                "terms": {
                  "genericId": [
                    3078711,
                    3119430
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...