在我的网站上使用Node.js匹配用户

时间:2016-12-26 11:40:06

标签: javascript mysql node.js

我目前正在开发一个“约会”网站作为学校项目。 我正在使用Node.js,Express,我的SQL和Pug(Jade)。 我一直在寻找过去的两天,但我找不到任何问题的答案,所以我在这里。 到目前为止,我的用户有个人资料页面,在数据库中我有以下有关他们的信息: - 年龄 - 性取向 - 性 - 位置(经度和纬度,国家和确切城市) - 标签(定义最佳的单词)

现在我拥有所有这些,我的用户必须能够通过以下方式进行搜索:   - 年龄   - 位置和标签。 我应该按顺序渲染,第一场比赛应该始终是最接近的位置。 如何对所有这些信息进行排序以检查我的任何用户是否可以匹配一个或多个人?

感谢您的帮助和圣诞快乐!

1 个答案:

答案 0 :(得分:0)

您可以遍历数据库中的所有用户并计算分数。积分是例如根据他们的距离来奖励。最后,分数最多的人将是最佳匹配。

以下是一些随机生成数据的示例 我做了假设

  • 每个人都对异性感兴趣
  • 纬度和经度是平面上的坐标,以便使用毕达哥拉斯定理来计算距离

let data = [
  {
    'name': 'John Doe',
    'sex': 'male',
    'pos': [ 43.036871, -89.324967 ],
    'tags': [ 'general', 'basic' ]
  },
  {
    'name': 'Amy Schmidt',
    'sex': 'female',
    'pos': [ 39.48586, -121.387316 ],
    'tags': [ 'honest', 'uneven' ]
  },
  {
    'name': 'Robert Summers',
    'sex': 'male',
    'pos': [ 33.657366, -86.643871 ],
    'tags': [ 'efficient', 'psychotic' ]
  },
  {
    'name': 'Steven Walls',
    'sex': 'male',
    'pos': [ 43.484856, -83.849829 ],
    'tags': [ 'huge', 'grumpy' ]
  },
  {
    'name': 'Elizabeth Bateman',
    'sex': 'female',
    'pos': [ 38.886231, -99.306865 ],
    'tags': [ 'heavy', 'goofy' ]
  },
  {
    'name': 'Robert Galusha',
    'sex': 'male',
    'pos': [ 29.713645, -95.534338 ],
    'tags': [ 'vast', 'depressed' ]
  }
];

function search(person, tags) {
  let scores = { }, distances = { },
      lat = person.pos[0], lng = person.pos[1];
  
  data.filter(user => user.name !== person.name).forEach(user => {
    scores[user.name] = 0;
    scores[user.name] += user.tags.filter(tag => tags.indexOf(tag) > -1).length;
    scores[user.name] += user.sex !== person.sex ? 1 : 0;
    
    let dlat = Math.abs(lat - user.pos[0]), dlng = Math.abs(lng - user.pos[1]),
        distance = Math.sqrt(Math.pow(dlat, 2) + Math.pow(dlng, 2));
    
    distances[user.name] = distance;
  });
  
  // Needed to normalize the distances
  let maxDistance = Object.values(distances).sort((a, b) => b - a).shift();
  
  for(let name in distances)
    // Substract the normalized distance from 1, so: shorter distance = more points
    scores[name] += (1 - distances[name] / maxDistance);
  
  // Sort by score; the best match is the first element
  return Object.entries(scores).sort((a, b) => b[1] - a[1]);
}

console.log(search(data[0], [ 'honest', 'vast' ]))

如果您希望某些因素对总分的影响比其他因素更重,则可以将它们乘以一定的权重。