The reference to Lucene complicates the equation a little bit. Let s solve it (or at least get a baseline) without it first.
Assuming the following datamodel (or something approaching.
tblUsers
UserId PK
UserName
Age
...
tblBuddies
UserId FK to tblUsers.UserId
FriendId tblUsers.Userid = Id of one of the friends
BuddyRating float 0.0 to 1.0 (or whatever normalized scale) indicating
the level of friendship/similarity/whatever
tblItems
ItemId PK
ItemName
Description
Price
...
tblUsersToItems
UserId FK to tblUsers.UserId
ItemId FK to
ItemRating float 0.0 to 1.0 (or whatever normalized scale) indicating
the "value" assigned to item by user.
A naive query (but a good basis for an optimized one) could be:
SELECT [TOP 25] I.ItemId, ItemName, Description, SUM(ItemRating * BuddyRating)
FROM tblItems I
LEFT JOIN tblUserToItems UI ON I.ItemId = UI.ItemId
LEFT JOIN tblBuddies B ON UI.UserId = B.FriendId
WHERE B.UserId = IdOfCurrentUser
AND SomeSearchCriteria -- Say ItemName = MP3 Player
GROUP BY I.ItemId, ItemName, Description
ORDER BY SUM(ItemRating * BuddyRating) DESC
The idea is that a given item is given more weight if it is recommended/used by a friend. The extra weigh is the more important if the friend is a a close friend [BuddyRating] and/or if the friend recommend this item more strongly [ItemRating]
Optimizing such a query depends on the overal number of item, the average/max numbers of buddies a given user has, the average/max number of items a user may have in his/her list.
Is this type of ideas/info you are seeking or am I missing the question?