【发布时间】:2016-05-05 01:08:28
【问题描述】:
首先:抱歉,这篇文章太长了,我试图以一种简单的方式解释一个困难的情况,同时,我试图提供尽可能多的信息。
我有一个算法试图在搜索过程中确定用户的期望。有几种方法可以使用它,而且我对它们都有同样的问题,所以,可以说我用它来消除歧义。好吧,使用像这样的数据库结构(或任何其他允许工作的):
发帖
ID | TITLE
---+----------------------------------------------
1 | Orange developed the first 7G phone
2 | Orange: the fruit of gods
3 | Theory of Colors: Orange
4 | How to prepare the perfect orange juice
关键字
ID | WORD | ABOUT
---+----------+---------
1 | orange | company
2 | orange | fruit
3 | orange | color
post_keywords
ID | POST | KEYWORD
---+-------+---------
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 4 | 2
.
如果用户在搜索框中搜索“橙色”一词,算法会认为orange 可能指的是公司、颜色或水果,并且通过回答几个问题,它试图确定用户正在寻找哪个。毕竟我得到了一个像这样的数组:
$e = array(
'fruit' => 0.153257,
'color' => 0.182332,
'company' => 0.428191,
);
在这一点上,我知道用户可能正在寻找有关水果的信息(因为fruit 的值更接近0),如果我错了,我的第二个赌注是color。在列表底部,company。
所以,通过 Join 和 ORDER BY FIELD(keywords.id, 2,3,1) 我可以给结果(几乎)完美的顺序:
- Orange: the fruit of gods
- How to prepare the perfect orange juice
- Theory of Colors: Orange
- Orange developed the first 7G phone
.
嗯...你可以想象,如果一切都那么好,我不会来寻求帮助的。所以,问题是在前面的例子中,我们只有 4 个可能的结果,所以,如果用户真的在寻找 company,他可以在第 4 个位置找到这个结果,一切都很好。但是...如果我们有 200 个关于水果的帖子和 100 个关于颜色的帖子,那么第一个关于公司的帖子排在第 301 位。
我正在寻找一种交替顺序的方法(以可预测和可重复的方式),因为我知道用户可能必须寻找fruit,然后是color,最后是公司。我希望能够在第一个位置(可能是第二个)显示关于fruit 的帖子,然后是关于color 的帖子,然后是company,然后再次开始这个循环,直到结果结束.
编辑:我会对 MySQL 技巧或改变方法的想法感到满意,但我不能接受第三方解决方案。
【问题讨论】:
-
事实上,我会按类别分组并返回每个类别的最佳结果,并允许此时用户单击该类别以查看该类别的所有其他链接。
-
看起来您正在使用关键字表在 MySQL 中构建倒排索引。你有一些查询理解能力。您是否考虑过使用 Elasticsearch 代替?我的这次谈话可能会帮助您了解如何使用 Elasticsearch elastic.co/elasticon/conf/2016/sf/…
-
^ 我同意.. ElasticSearch 在这里会很有帮助.. 这样您就可以对搜索结果和许多其他与搜索相关的很酷的东西进行排名...
-
@Eric 我不能使用那个选项,因为我没有准确解释我在做什么,因为它有点复杂,所以,我发明了一个更容易解释的情况(博客示例) 但保持相同的原则。但是,足以说在用户眼中,我们所做的那种分类看起来很荒谬,但是,在对算法的测试中,他们说“现在所有好的信息都在一起了,必须在第一时间页面,但如果我在第 1 页找不到它,我会在第 20 页或其他地方找到它”。
-
@DougT。是的,我使用倒排索引,但我将阅读有关 Elasticsearch 的文章,看看它的使用情况如何。