首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨多行的记录的匹配相关性(不能将GROUP_CONCAT与MATCH一起使用)

跨多行的记录的匹配相关性(不能将GROUP_CONCAT与MATCH一起使用)
EN

Stack Overflow用户
提问于 2013-11-07 16:37:30
回答 1查看 248关注 0票数 0

我有MySQL的问题,我需要一个啤酒午餐。我想做这样的查询:

SELECT MATCH(some_string) AGAINST ('beer lunch') FROM (SELECT GROUP_CONCAT(some_column) AS some_string FROM myrealtable) AS mytablealias;

不幸的是,我发现不能对GROUP_CONCAT列执行全文匹配,因为完整文本索引只存在于原始列(some_column)中,而不存在于别名表中的级联列(some_string)中。

我真的需要做一个全文搜索,并为在我的表中的多个行中被中断的连在一起的字符串生成一个相关性评分。

这里有一个小的思考实验,我把它放在一起来研究关联问题。让我们从一个具有连接字符串的表开始:

代码语言:javascript
运行
复制
+----------+-------------------------------------------------------------------------------------+
| table_id | concat_string                                                                       |
+----------+-------------------------------------------------------------------------------------+
|        1 | I like beer Beer is a healthy choice My brother drinks beer for lunch every day     |
|        2 | I like juice Juice is a healthier choice My brother drinks beer for lunch every day |
+----------+-------------------------------------------------------------------------------------+

现在,我在这个表上执行以下匹配查询:SELECT table_id,MATCH(concat_string) AGAINST('beer lunch') AS score FROM myconcattable;和我获得了以下相关分数:

代码语言:javascript
运行
复制
+----------+----------------------------+
| table_id | score                      |
+----------+----------------------------+
|        1 | 0.000000007543713209656744 |
|        2 | 0.000000003771856604828372 |
+----------+----------------------------+

显然,在搜索“啤酒午餐”时,第一行比第二行更相关.但问题是,我的字符串在需要根据外键(foreign_id)分组的多个行中断开。下面是我的桌子的样子:

代码语言:javascript
运行
复制
+----------+--------------------------------------------+------------+
| table_id | some_string                                | foreign_id |
+----------+--------------------------------------------+------------+
|        1 | I like beer                                |          1 |
|        2 | Beer is a healthy choice                   |          1 |
|        3 | My brother drinks beer for lunch every day |          1 |
|        4 | I like juice                               |          2 |
|        5 | Juice is a healthier choice                |          2 |
|        6 | My brother drinks beer for lunch every day |          2 |
+----------+--------------------------------------------+------------+

现在让我们尝试一下这个表上的查询(SELECT table_id,MATCH(some_string) AGAINST('beer lunch') AS score, foreign_id FROM mybrokentable;):

代码语言:javascript
运行
复制
+----------+----------------------+------------+
| table_id | score                | foreign_id |
+----------+----------------------+------------+
|        1 | 0.031008131802082062 |          1 |
|        2 | 0.031008131802082062 |          1 |
|        3 |  0.25865283608436584 |          1 |
|        4 |                    0 |          2 |
|        5 |                    0 |          2 |
|        6 |  0.25865283608436584 |          2 |
+----------+----------------------+------------+

好的,如果我把分数相加为和,那么foreign_id 1看起来比foreign_id 2更相关,但是与字符串连接到一个表时相比,它并不是非常准确。

理想情况下,我希望设计一个查询,为外部ids生成一个关联评分,如下所示:

代码语言:javascript
运行
复制
+----------------------------+------------+
| score                      | foreign_id |
+----------------------------+------------+
| 0.000000007543713209656744 |          1 |
| 0.000000003771856604828372 |          2 |
+----------------------------+------------+

你知道我该怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-07 16:52:50

您可以尝试用子查询将单个短语匹配中的分数相加,如下所示。你必须进行实验,看看它是否给出了你所需要的结果。

代码语言:javascript
运行
复制
SELECT SUM(score) AS total_score,
       foreign_id
  FROM (
     SELECT table_id,
            MATCH(some_string) AGAINST('beer lunch') AS score, 
            foreign_id 
       FROM phrase
       ) AS scores
 GROUP BY foreign_id
 ORDER BY total_score DESC

我在这个小提琴http://sqlfiddle.com/#!2/355b1/1/0中使用了布尔模式,因为普通的全文搜索在小文本样本上做了一些奇怪的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19841507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档