Elasticsearch对相似用户喜欢的文档评分更高



在Elasticsearch中,我有两个索引,placesusers。这是地图的地方:

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的新手,我很难想出一个评分功能来获得相似用户喜欢的评分位置,尤其是因为用户喜欢的数据存储在与我实际查询的不同的索引中。解决这个问题的最佳方法是什么?在我目前的数据模型中,这样的事情可能发生吗?

我认为您必须执行两个请求,如下所示

  1. 获取所有相似用户的点赞位置id
  2. 然后使用位置ID来匹配和排除点赞和看到的位置

步骤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"
}
}
}

您可以在函数得分查询中使用高斯衰减函数,如下所述:

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"
}
}
}

但我想知道在您的数据模型中,likesplaces之间的当前连接是什么。

最新更新