2016-12-26 4 views
0

私は現在、「デート」ウェブサイトを学校プロジェクトとして開発中です。 私はNode.js、Express、my SQL、Pug(Jade)を使用しています。 私は過去2日間探してきましたが、私の質問に答えが見つからないので、ここにいます。 はこれまでのところ、私のユーザーはプロフィールページがあり、データベースに私はそれらに関する以下の情報を持っている: - 年齢 - 性的指向 - セックス - 場所(緯度と経度、国や正確な都市) - タグ(単語の定義をそれらは最高です)私のウェブサイトでNode.jsを使用しているユーザーの一致

私はこれをすべて持っているので、私のユーザは以下の方法で検索できなければなりません: - 場所とタグ。 私はオーダーでレンダリングするはずです。最初のマッチは常に最寄りの場所でなければなりません。 どのユーザーが1人または複数のユーザーに一致するかどうかを確認するために、これらの情報をすべて並べ替えるにはどうすればよいですか?

あなたのお手伝いとメリークリスマスをありがとう!

答えて

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' ]))
    を計算するためにピタゴラスの定理を使用するために平面上の座標で作ら

    いくつかの要因が必要な場合スコア全体に重大な影響を及ぼすには、特定の重みを乗じることができます。

  • +0

    大変ありがとうございました!これは完璧な答えかもしれません。そしてあなたは約束を使っています。私はこのプロジェクト中に彼らを勉強しようとしています。 ピタゴラスの定理の代わりに、私は使用しようとしていた:http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates しかし、私は両方を試してみると思います。 とにかく助けてくれてありがとう、私はそれを働かせたら知らせます。 乾杯。 – pkerckho

    +0

    ピタゴラスの定理をすべての場合に使用するのであれば、私は完全には分からないので、それを確認する必要があります。そして、私はどこで約束を使用しましたか? – schroffl

    +0

    ああ、私は悪いですが、私はLETが約束と共に使われることを意図していました。 私はJavascriptとNode.Jsを初めて使用しています。 ピタゴラス定理についてはわかりませんが、とにかく試してみましょう! – pkerckho

    関連する問題