Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 比较数据库中或本地两个表之间的文本字符串_Mysql_Sql_Solr_Full Text Search_Sphinx - Fatal编程技术网

Mysql 比较数据库中或本地两个表之间的文本字符串

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对此不起作用。我刚刚发现了Solr/Sphinx,它似乎是解决这个问题的正确工具,所以如果你知道Solr或Sphinx,我很想听听你的意见

基本上,我有一个带有专利信息的.tsv和一个带有产品名称的.csv。我需要将“专利”列的每一行与产品名称相匹配,并在新的.csv列中提取出现的内容

您可以向下滚动并查看最后的示例。

原始问题:

这里的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更合理的方法。非常感谢您的帮助!我会回答的当我设法解决这个问题的时候。