Реализация запроса на основе ограничений в Elasticsearch - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь реализовать запрос в ElasticSearch (Nest), в котором возвращаются только документы, соответствующие определенным ограничениям. Каждый документ будет иметь массив строк (Restrictions), и запросу также будет предоставлен массив строк (назовем это «saidRestrictions»), и цель состоит в том, чтобы извлечь (отфильтровать) только те документы, которые ТОЛЬКО имеют указанные ограниченияв поле "connectedRestrictions"

Допустим, у меня есть документы

[
 {
  "Id":1,
  "Restrictions":["restriction1", "restriction2"]
 },
 {
  "Id":2,
  "Restrictions":["restriction1"]
 },
 {
  "Id":3,
  "Restrictions":["restriction1", "restriction2", "restriction3"]
 }
]

Учитывая satisfiedRestrictions = ["restriction1", "restriction2"], запрос должен возвращать документы с идентификаторами 1 и 2. У документа 3 есть дополнительное ограничение ("limit3")) не указан в параметре satisfiedRestrictions, поэтому его следует исключить из результатов.

Это можно было бы решить с помощью предложения must_not (не должно совпадать с "restiction3"), но при этом предполагается, что всевозможные значения ограничений должны где-то храниться. Идеальное решение было бы без необходимости делать это.

Есть ли хороший способ для достижения этого или эта модель «на основе ограничений» не разрешима?

1 Ответ

0 голосов
/ 05 ноября 2019

Хорошо, если у вас есть разные значения в вашем массиве, это должно работать:

{
  "query": {
    "bool" : {
      "must" : {
        "terms" : { "Restrictions" : ["restriction1", "restriction2"] }
      },
      "must" : {
        "script" : {
          "script" : {
            "inline" : "doc[\"Restrictions\"].length < 3",
          }
        }
      }
    }
  }
}

отредактировано: == 2 заменено на <3 </p>

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