В Elasticsearch у меня есть два индекса, places
и users
. Это отображение для мест:
mappings: {
location: {
type: "geo_point"
}
}
И это отображение для пользователей:
mappings: {
likes: {
type: "keyword"
},
seen: {
type: "keyword"
}
}
Как вы можете видеть, пользователь может видеть и видеть разные места. Теперь я хочу запрашивать места, которые пользователь еще не видел или не любил, и хочу показать места, которые нравятся пользователям, которым сначала нравятся места, подобные запрашивающему пользователю. Вот запрос, который мне удалось сформулировать:
POST /places/_search
{
"_source": [
"id"
],
"size": 1,
"query": {
"function_score": {
"query": {
"bool": {
"must_not": [
{
"terms": {
"_id": {
"index": "users",
"id": "vu0E1rjJEqcgyfj29fwZ",
"path": "seen"
}
}
},
{
"terms": {
"_id": {
"index": "users",
"id": "vu0E1rjJEqcgyfj29fwZ",
"path": "likes"
}
}
}
],
"filter": {
"geo_distance": {
"distance": "200km",
"location": {
"lat": 52,
"lon": 13
}
}
}
}
},
"random_score": {},
"boost_mode": "replace"
}
}
}
Однако в данный момент этот запрос просто присваивает случайный результат всем результатам. Поскольку я новичок в Elasticsearch, я изо всех сил пытаюсь придумать функцию оценки, чтобы получить места для оценки, которые понравились аналогичным пользователям, и выше, особенно потому, что данные о лайках пользователей хранятся в другом индексе, чем тот, который я на самом деле запрос. Как лучше всего подойти к этой проблеме? Возможно ли что-то подобное с моей текущей моделью данных?