我正在为我的应用程序创建一个新的搜索系统。现在的想法是使用查询放宽以从数据库获得更广泛的结果,然后计算它与用户的相关性。问题在于算法。我正在考虑使用像最近邻算法这样的东西,但我对如何使用它有点不确定。
如何获取数据库中记录与用户搜索的相关性百分比?
我需要在属性 distance 和 category 中执行此操作。换句话说,当我查询数据库时,距离乘以2,并通过选择父类别来放宽类别。
一个例子:如果用户搜索距离最远30公里且类别为“足球”的东西,我将从数据库中获取所有记录直到60公里和'ballSports'(在树中像:sports) - > fullContact-> ballSports->足球,所以我会得到足球,足球,橄榄球等运动。
还需要在考虑用户属性权重的情况下计算此%。如果用户认为类别比距离更重要,则在计算相关性时必须考虑到这一点。
类别树和计算距离的公式的一个很好的例子可以在第3页找到:http://reference.kfupm.edu.sa/content/d/i/a_distributed_case_based_reasoning_appli_58512.pdf
如何将该公式应用于属性? 顺便说一下,我正在使用MongoDB,因此所有数据都在文档中,与其他表没有任何关系。
谢谢
答案 0 :(得分:2)
我首先假设对于搜索结果,您使用的是经典关系数据库,并且表格具有如下平面结构:
| categoryId |纬度|经度| parentCategoryId |
因此,基于父类别的放松类别可以是基于用户输入的类别的父节点的子节点的简单树搜索(假设您的树已经在内存中)。您可以在类别表上使用sql join,但根据我的经验,它可以更好地将算法内容传递给java - 它更容易测试/重构,并且您可以获得具有预测时间/空间复杂性的各种算法。另一方面,Sqls可能会让您对执行计划成本感到头疼,有时在不同的数据库提供商之间会有很大差异。
如何根据距离和多个类别匹配将%与用户相关联?什么首先显示 - 如果用户进入足球,足球还是红宝石?
嗯,这是一个非常好的问题,我不知道答案很好,但我要做的是使用谷歌搜索的现有数据: 鉴于用户输入足球(球类运动类别的孩子)
谷歌搜索结果排名你可以轻松地以编程方式预先计算,或动态检索(除非你打算经常更改类别,否则我不会动态执行)
作为用户,我对此输出感到满意,请告诉我您的想法: - )
修改强>: 我读过纸张,看起来在你的情况下,相似性公式可以简化为计算两个单词之间的相似性。
这样做的一种方法是获得两个类别的单词克的谷歌排名('足球橄榄球'将给你'199,000,000'和'足球足球'将给你'441,000,000')。它看起来不错。
为什么我如此着迷谷歌排名?这些人拥有数以万计的数据,这些数据基于体育网站,文章及其与您的域名问题相关的数据。如果有人形成纸张(Western Air Ltd.) - 他们的数据特定于他们的内部域,他们必须使用他们的域(如功能数量,每个功能的重要性权重等)来处理我们的相似性。