Elasticsearch: не возвращать документ, если любое из полей вложенного объекта соответствует значению термина - PullRequest
2 голосов
/ 29 апреля 2020

Я борюсь с написанием запроса, который не должен возвращать документ, если какое-либо из его значений поля вложенных объектов совпадает со значением термина, переданным в запросе.

Пример документа:

 {
      "id": 1,
      "test": "name",
      "rules": [
        {
          "id": 2,
          "name": "rule3",
          "questionDetailConditionalRules": [
            {
              "questionDetailId": 1
            },
            {
              "questionDetailId": 2
            }
          ]
        },
        {
          "id": 3,
          "name": "rule3",
          "questionDetailConditionalRules": [
            {
              "questionDetailId": 4
            },
            {
              "questionDetailId": 5
            }
          ]
        }
      ]
    }

Поле rule имеет вложенный тип

Мой вложенный поисковый запрос:

{
  "query": {
    "nested": {
      "path": "rules",
      "query": {
        "bool": {
          "must_not": [
            {
              "terms": {
                "rules.questionDetailConditionalRules.questionDetailId": [
                  1
                ]
              }
            }
          ]
        }
      }
    }
  }
}

Ожидаемый результат : документ не должен возвращаться Фактический результат : документ возвращается.

Должен ли я что-то пропустить в своем запросе?

1 Ответ

3 голосов
/ 29 апреля 2020

Был в состоянии воспроизвести вашу проблему и исправить ее, пожалуйста, найдите пошаговое решение, чтобы она работала. вам нужно переместить nested внутри блока must_not и внести некоторые изменения в ваш запрос.

Индекс def

{
    "mappings" :{
        "properties" :{
            "rules" :{
                "type" : "nested"
            }
        }
    }
}

Индексировать ваш пример до c

{
    "rules": [
        {
            "id": 2,
            "name": "rule3",
            "questionDetailConditionalRules": [
                {
                    "questionDetailId": 1
                },
                {
                    "questionDetailId": 2
                }
            ]
        },
        {
            "id": 3,
            "name": "rule3",
            "questionDetailConditionalRules": [
                {
                    "questionDetailId": 4
                },
                {
                    "questionDetailId": 5
                }
            ]
        }
    ]
}

Поисковый запрос

{
    "query": {
        "bool": {
            "must_not": [
                {
                    "nested": {
                        "path": "rules",  --> note `nested` is inside the `must_not` block.
                        "query": {
                            "bool": {
                                "filter": [
                                    {
                                        "term": {
                                            "rules.questionDetailConditionalRules.questionDetailId": 1
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}

Результат поиска

"hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }

Примечание: вы можете найти больше информации в этой ссылке.

...