Поддерживает ли Elasticsearch запрос AND для нескольких значений? - PullRequest
0 голосов
/ 27 апреля 2018

ElasticSearch v: 5,3

У меня есть одно хранилище массива элементов в упругом поиске.

userId: "123"
items: [
  {
    "range": {
      "from": 10,
      "to": 30
    },
    "id": "1"
  },
  {
    "range": {
      "from": 20,
      "to": 100
    },
    "id": "2"
  },
  {
    "range": {
      "from": 5,
      "to": 90
    },
    "id": "3"
  },
]

Это только одна запись. Рассмотрим это как несколько записей, которые содержат ключ элементов. Теперь я хочу выполнить поисковый запрос с идентификатором, и это уважаемый диапазон. Итак, мой текущий запрос выглядит так

GET product/item/_search{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "items.id": "1"
          }
        },
        {
          "range": {
            "items.range.from": {
              "gte": 20,
              "lte": 30
            }
          }
        },
        {
          "range": {
            "items.range.to": {
              "gte": 20,
              "lte": 30
            }
          }
        },

      ]
    }
  }
}

В настоящее время это будет выполнять поисковый запрос, который имеет id = 1 и значения диапазона от> = 20 до <= 30. Таким образом, он вернет все записи, содержащие id = 2, а также диапазон от 20 до 30. даже если в других записях, если id = 1 отсутствует, он будет искать значения диапазона и будет возвращать записи, если диапазон соответствует. </p>

Вместо этого я хочу искать записи, которые имеют id = 1 и значение этого идентификатора должно быть от 20 до 30. Итак, у меня вопрос: поддерживает ли упругий поиск этот тип запроса AND?

1 Ответ

0 голосов
/ 27 апреля 2018

Ваше поле items должно быть nested в вашем отображении, например:

PUT product
{
  "mappings": {
    "item": {
      "properties": {
        "itemId": {
          "type": "long"
        },
        "items": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "long"
            },
            "range": {
              "properties": {
                "from": {
                  "type": "long"
                },
                "to": {
                  "type": "long"
                }
              }
            }
          }
        }
      }
    }
  }
}

Тогда вы сможете запросить вот так:

GET product/item/_search
{
  "query": {
    "nested": {
      "path": "items",
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "items.id": "1"
              }
            },
            {
              "range": {
                "items.range.from": {
                  "gte": 20,
                  "lte": 30
                }
              }
            },
            {
              "range": {
                "items.range.to": {
                  "gte": 20,
                  "lte": 30
                }
              }
            }
          ]
        }
      }
    }
  }
}

PS: Я предлагаю вам взглянуть на integer_range тип данных вместо вашего range.from/to объекта. Просто мои два цента

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