Родительско-дочерние отношения в ElasticSearch - поиск предложения во всех дочерних документах вместе - PullRequest
2 голосов
/ 30 мая 2019

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

Parent Doc structure
{
    name
    address
    description
}

Child doc
{
    feedbackContent
}

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

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

  • лучшие услуги

  • хорошие студенты

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

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

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

  • потрясающее местоположение

Клиент должен иметь возможность искать НПО, у которых есть все термины в строке запроса.Пример - клиент выполнил поиск "best" AND "location".

Поскольку best присутствует в child1 и child2, а location присутствует в child 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"}
          }
        }
      }
    }
  }
}

1 Ответ

1 голос
/ 31 мая 2019

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

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

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

Настройте ваш запрос следующим образом:

GET message_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "best"
              }
            }
          }
        },
        {
          "has_child": {
            "type": "feedback",
            "query": {
              "term": {
                "feedback": "location"
              }
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...