我正在尝试使用 ElasticSearch 创建具有社交功能的商业搜索。我有一个企业目录,用户可以通过不同的方式与这些企业进行交互:通过查看它们、检查它们等。
当用户搜索商家时,我希望能够在结果顶部向他们显示他们的朋友与之互动过的商家(或根据这些互动进行过滤)。设置索引以实现此目的的最佳方法是什么?
我可以想到一些可能的解决方案,但我是 ES 的初学者,我不确定什么会导致问题:
我可以使用多租户并为每个用户创建一个单独的索引。我已经排除了这种可能性,因为用户数量远远大于企业数量或用户特定内容的数量。
我可以向每个索引企业添加用户/分数对的列表。每个与企业交互的用户都会在那里,分数将代表他们与企业的交互量(这对于我的过滤/排序目的来说已经足够了)。每次他们与业务互动时,我都会更新索引中的分数。问题在于,我只关心朋友的活动,因此在为企业创建综合分数时,我需要找到某种方法来考虑我的朋友是谁。我不知道如何在 ES 中做到这一点。
我可以创建一个类似的方案,但该分数将反映我的朋友与企业的互动,而不是记录我与企业的互动。这消除了在 ElasticSearch 中对我的社交图进行建模的需要,但这确实意味着每当一个人与企业交互时,我都需要更新他们所有朋友的分数。这也意味着每个企业的用户/分数对列表将会更大,因为它需要包括任何有朋友与该企业进行过交互的人。
我能想到的最终解决方案是跟踪业务中发生的每一次交互,并将其添加到 ES 中的业务文档中。这对我来说似乎不太现实——它结合了其他解决方案的问题。但这可能是保持索引最新的最直接的方法。
感谢您的帮助!
我投票支持修改后的#2。
我不会将每个用户/分数对存储在业务文档本身中,而是创建父/子关系。这使您可以更新子项的分数(用户分数),而无需重新索引整个业务文档(以及所有其他用户分数)。
查看此页面,了解一个很棒的教程,家长/孩子大约已经完成一半了:http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/ http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/
然后你可以使用has_child 过滤器 http://www.elasticsearch.org/guide/reference/query-dsl/has-child-filter.html or top_children 查询 http://www.elasticsearch.org/guide/reference/query-dsl/top-children-query.html只查找您的朋友有分数的那些企业。关于订购儿童文档有一些注意事项,但该教程已涵盖这些内容,因此请确保您阅读到底部。
然后我只需对所有“非社交”排名搜索执行正常查询。
或者,您可以将所有内容集中在一起,并为您朋友得分的比赛添加提升,以便所有内容排名适当。执行两个查询并自己组合它们可能会更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)