Mysql 比较数据库中或本地两个表之间的文本字符串
编辑:SQL对此不起作用。我刚刚发现了Solr/Sphinx,它似乎是解决这个问题的正确工具,所以如果你知道Solr或Sphinx,我很想听听你的意见 基本上,我有一个带有专利信息的.tsv和一个带有产品名称的.csv。我需要将“专利”列的每一行与产品名称相匹配,并在新的.csv列中提取出现的内容 您可以向下滚动并查看最后的示例。Mysql 比较数据库中或本地两个表之间的文本字符串,mysql,sql,solr,full-text-search,sphinx,Mysql,Sql,Solr,Full Text Search,Sphinx,编辑:SQL对此不起作用。我刚刚发现了Solr/Sphinx,它似乎是解决这个问题的正确工具,所以如果你知道Solr或Sphinx,我很想听听你的意见 基本上,我有一个带有专利信息的.tsv和一个带有产品名称的.csv。我需要将“专利”列的每一行与产品名称相匹配,并在新的.csv列中提取出现的内容 您可以向下滚动并查看最后的示例。 原始问题: 这里的SQL新手,请容忍我:)。我不知道该怎么做: 我的数据库: mysql> SHOW TABLES; +------------------
原始问题: 这里的SQL新手,请容忍我:)。我不知道该怎么做: 我的数据库:
mysql> SHOW TABLES;
+-----------------------+
| Tables_in_prodpatdb |
+-----------------------+
| assignee |
| patents |
| patent_info |
| products |
+-----------------------+
mysql> DESCRIBE patents;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| ... | | | | | |
| patent_id | varchar(20) | YES | | NULL | |
| text | text | YES | | NULL | |
| ... | | | | | |
+-------------+-------------+------+-----+---------+-------+
mysql> DESCRIBE products;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| name | text | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
我必须处理name
和text
列,它们看起来如下:
name
product1
product2
product3
...
~10M rows
Operation Product
1 prod5, prod6
2 prod7
...
我需要检查
patents.text
第1行,并将其与products.name
列进行匹配,以查找该行中的每个产品名称,然后将这些产品名称存储在新表中。然后检查第2行并重复
如果一个patents.text
行有一个产品名称多次,则只将其复制到新表中一次。如果某行没有产品名称,请跳过它。输出应如下所示:
name
product1
product2
product3
...
~10M rows
Operation Product
1 prod5, prod6
2 prod7
...
例如:
name
valve
a/c fan
farmed salmon
...
期望输出:
Operation Product
1 valve, a/c fan
2 farmed salmon
...
您可以使用
GROUP\u CONCAT
进行内部选择
查询,例如:
SELECT p.text,
(SELECT GROUP_CONCAT(name) FROM products WHERE LOCATE(LOWER(name), LOWER(p.text)) > 0) AS 'products'
FROM patent p;
我能看到以合理的性能执行此操作的唯一方法是全文搜索。我自己很少做这些(20多年来可能做过3次);所以我会听从其他更有经验的人 作为起点使用 如果已创建全文索引,则可以是以下简单内容:
SELECT pat.patent_ID, group_concat(P.Name)
FROM patents pat
CROSS JOIN products p
WHERE MATCH (pat.text)
AGAINST (p.name IN NATURAL LANGUAGE MODE)
GROUP BY pat.patent_ID;
因为每一个产品和每一项专利我们都必须交叉加入,所以我们现在有8.8亿行;光是这一点就太多了。然而,我对此的阅读越多,我就越意识到我们在RDBMS中处理非结构化数据。就其性质而言,这不是一个理想的适合;在RDBMS之外,可能有更优化的方法来处理这个问题,或者我们必须花时间在RDBMS中构造数据,以便索引更有效(例如将文本拆分为每个单词自己的行以进行索引)
最后,我们真的需要寻找所有的产品吗?这两种大小所涉及的数据量都很大,这意味着在一个不能很好地处理非结构化数据的数据库中,这需要时间
编辑
划伤下方,因为它将无法有效处理负载。但是为了子孙后代保留它
我认为concat()
和group\u concat()
可能会奏效
我们在patent.text类似于生成多行的产品名称的地方加入。然后,组concat将这些行合并到一个记录中。我不确定你的结果中“手术”是从哪里来的
SELECT pat.text, group_concat(P.Name) as Product
FROM patents pat
INNER JOIN text
on pat.text like concat('%',p.name,'%')
GROUP by pat.text
然而,不要期望这会很快;当我们在进行通配符搜索时,两端都使用%进行搜索;因此,无法使用索引。操作1是当您阅读
专利时。文本
第1行,操作2是当您阅读下一行包含产品名称时,等等。感谢您的回答,我将尝试此操作。一个问题是,如何将输出保存在另一列或表中?Nvm,这部分代码正确吗<代码>作为产品:)它已经运行了10个小时,无意中,我将查询返回的行数限制为500行,因此这可能是不可行的。如果阅读每一行专利需要1分钟,*8800万行,那么xD T.TA全文搜索可能会更快。知道表的大小。我不经常这样做,所以我必须查找设置并处理。嗯,感谢您提供的信息,我正在阅读,但我不知道如何使MATCH()逐行而不是整列显示。工作台报告了(选择
。可能这是使用多括号的子查询的错误?因为代码看起来很好。p.text,
后没有逗号,这是一个愚蠢的错误,很抱歉,现在运行代码,但返回错误代码:1242。子查询在一段时间后返回超过1行
。在任何情况下,全文搜索可能更好。)上面建议的?不确定这是否会更快;但尝试一下是个好主意。@DarshanMehta我运行了21个小时的代码。它运行了1159秒,其余的时间都在抓取。我停止了它,因为我正在尝试使用Solr,我认为这是一种比使用RDBMS更合理的方法。非常感谢您的帮助!我会回答的当我设法解决这个问题的时候。