Родительско-дочерние отношения в ElasticSearch — поиск предложения во всех дочерних документах вместе взятых

Я супер новичок в Elastic Search. У меня есть вариант использования, который, кажется, может быть решен отношениями родитель-потомок. Родительский документ содержит описание НПО. Дочерний документ содержит различные отзывы, отправленные в НПО.

Parent Doc structure
{
    name
    address
    description
}

Child doc
{
    feedbackContent
}

Допустим, НПО-А 4 отзыва (имеется в виду 4 дочерних документа)

  • лучшие учителя

  • лучшие условия

  • хорошие ученики

  • расположение слишком далеко

Другая НПО-Б имеет 2 отзыва (имеется в виду 2 дочерних документа)

  • хорошее качество еды

  • отличное место

Клиент должен иметь возможность искать НПО, которым переданы все термины в строке запроса. Пример - клиент ищет «лучший» И «местоположение».

Поскольку best присутствует в дочернем элементе1 и дочернем элементе 2, а location присутствует в дочернем элементе 4, NGO-A является допустимым результатом. Однако для NGO-B child2 содержит один поисковый запрос, а другой поисковый запрос отсутствует в каком-либо другом дочернем документе, поэтому NGO-B не является допустимым результатом.

Я прочитал документ - https://blog.mimacom.com/parent-child-elasticsearch/, который довольно хорош, но не могу сделать вывод, можно ли это сделать.

Примеры, которые я пробовал

PUT message_index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0,
    "mapping.single_type": true
  },
  "mappings": {
    "doc": {
      "properties": {
        "ngo": {"type": "text"},
        "feedback": {"type": "text"},
        "ngo_relations": {
          "type": "join",
          "relations": {
            "ngo": "feedback"
          }
        }
      }
    }
  }
}

POST message_index/doc/_bulk
{"index": {"_id":1}}
{"name":"teach for india", "ngo_relations": {"name":"ngo"}}
{"index":{"_id":2}}
{"name":"hope for autism", "ngo_relations": {"name":"ngo"}}

PUT message_index/doc/3?routing=1
{"feedback":"best food","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/4?routing=1
{"feedback":"average location","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/5?routing=1
{"feedback":"awesome staff","ngo_relations":{"name":"feedback", "parent":1}}

PUT message_index/doc/6?routing=2
{"feedback":"best teachers","ngo_relations":{"name":"feedback", "parent":2}}

PUT message_index/doc/7?routing=2
{"feedback":"awesome overload","ngo_relations":{"name":"feedback", "parent":2}}

Для лучшего поиска и поиска местоположения необходимо вернуть просто научите индийскую НПО.

Нет хитов:

GET message_index/_search
{
  "query": {
    "has_child": {
      "type": "feedback",
      "query": {
        "bool": {
          "must": {
            "term": {"feedback": "best"}
          },
          "must": {
            "term": {"feedback": "location"}
          }
        }
      }
    }
  }
}

Оба документа возвращены.

GET message_index/_search
{
  "query": {
    "has_child": {
      "type": "feedback",
      "query": {
        "bool": {
          "should": {
            "term": {"feedback": "best"}
          },
          "should": {
            "term": {"feedback": "location"}
          }
        }
      }
    }
  }
}
2
0
455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это можно сделать. Вы были близки, просто небольшая ошибка в запросе.

В вашем дочернем запросе вы выполняете bool с двумя must/should. Поэтому ваш запрос таков: дайте мне все документы, у которых есть дочерний элемент, чтобы у дочернего элемента были оба (или «один из» в случае необходимости) термины «лучший» и «местоположение».

Принимая во внимание, что вы хотите: дайте мне все документы, чтобы у них был ребенок, чтобы у ребенка был термин «лучший», а также чтобы у ребенка был термин «местоположение».

Измените запрос следующим образом:

GET message_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "best"
              }
            }
          }
        },
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "location"
              }
            }
          }
        }
      ]
    }
  }
}

Другие вопросы по теме