Elasticsearch скоринг документов понравился подобным пользователям выше - PullRequest
4 голосов
/ 19 апреля 2020

В 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, я изо всех сил пытаюсь придумать функцию оценки, чтобы получить места для оценки, которые понравились аналогичным пользователям, и выше, особенно потому, что данные о лайках пользователей хранятся в другом индексе, чем тот, который я на самом деле запрос. Как лучше всего подойти к этой проблеме? Возможно ли что-то подобное с моей текущей моделью данных?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Я думаю, что вам нужно выполнить два запроса, как показано ниже

  1. Получить идентификаторы местоположения для всех похожих пользователей
  2. Затем использовать идентификаторы местоположения для сопоставления и исключить "лайки" и "увиденное" местоположение

Пример запроса шага 1:

GET users/_search
{
  "_source": [
    "likes"
  ],
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "likes": {
              "index": "users",
              "id": "vu0E1rjJEqcgyfj29fwZ",
              "path": "likes"
            }
          }
        }
      ],
      "must_not": [
        {
          "ids": {
            "values": [
              vu0E1rjJEqcgyfj29fwZ
            ]
          }
        }
      ]
    }
  }
}

Пример запроса шага 2:

GET places/_search
{
  "_source": [
    "id"
  ],
  "size": 1,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "ids": {
                "values": [] # Put all the similar user like ids here
              }
            }
          ],
          "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"
    }
  }
}
0 голосов
/ 21 апреля 2020

Вы можете использовать функцию гауссова затухания в запросе оценки функции, как хорошо описано здесь :

GET /places/_search
{
  "size": 5,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must_not": [
            {
              "terms": {
                "_id": {
                  "index": "users",
                  "type": "_doc",
                  "id": "vu0E1rjJEqcgyfj29fwZ",
                  "path": "seen"
                }
              }
            },
            {
              "terms": {
                "_id": {
                  "index": "users",
                  "type": "_doc",
                  "id": "vu0E1rjJEqcgyfj29fwZ",
                  "path": "likes"
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "location": {
              "origin": {
                "lat": 52,
                "lon": 13
              },
              "scale": "200km"
            }
          }
        }
      ],
      "boost_mode": "replace"
    }
  }
}

Но мне интересно, какова текущая связь между likes и places в вашей модели данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...