Why one-sided scoring fails
Most recommendation techniques ask one question: how much will this person like that item? Matrimony is different. A suggestion is only worth something if both people would accept it. Recommending someone to a member who would never accept them wastes that member's daily attention and fills the other person's inbox with a request that cannot succeed.
Score both directions, then combine
We score every pair twice, once from each person's point of view. Each direction is built from small scorers, one for each dimension: community, age, height, marital status, diet, smoking, drinking, education, income, location, language and tags.
The two scores are then combined with a harmonic mean, weighted by how much each side has actually told us. The reason is how it behaves with a lopsided pair. An ordinary average lets one very high score hide a very low one: a pair that scores 90 in one direction and 30 in the other averages out at a comfortable 60. A harmonic mean pulls the result toward the weaker side, and with equal information the same pair comes out at 45. A match that suits only one person cannot rank high.
We also apply shrinkage. When a pair has little information between them, the final score is blended toward a neutral starting value instead of trusting a thin profile, so sparse data does not produce an extreme score. Members can also see why: the result is grouped into five parts (community, education, lifestyle, location and interests), and a group with no real information is left out rather than shown as zero.
Fairness is a stage in the ranking, not an afterthought
A feed sorted purely by score has a known side effect: the same popular profiles keep rising, and newer or quieter profiles are never seen. So ranking runs as separate stages, and each can be tuned and tested on its own:
- Stages for exposure, recent activity and verification.
- Page assembly that shapes each page for freshness, variety and a little exploration.
- Candidate pools that mix active, random and new profiles, instead of only the top of the list.
- A relaxation step: when a strict search finds too few people, the criteria loosen step by step, and the response says which ones were relaxed.
We also record how stable the ranking is from one view to the next, and track fairness metrics, because a ranking you do not measure is a ranking you cannot improve.
Doing the heavy work ahead of time
Scoring deeply is expensive, so a nightly job scores a larger pool and stores the daily picks. Reads come from a Redis cache, are checked again at the moment they are served, and keep working in a simpler way if the cache is unavailable. Members get a fast feed, and the expensive thinking happens when nobody is waiting.
What we do not claim
This is a rule-based recommender, not machine learning, and we make no claims about how accurate its matches are. It is our own product, and we have not measured it against real outcomes at scale. What we can say is how it is built, and why each choice was made.