Я супер новичок в 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"}
}
}
}
}
}
}
Это можно сделать. Вы были близки, просто небольшая ошибка в запросе.
В вашем дочернем запросе вы выполняете 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"
}
}
}
}
]
}
}
}