使用mySQL SELECT的结果作为匹配自然语言查询的输入
我需要用自然语言对一个mySQL表字段进行研究,将另一个表字段的值作为输入。我尝试了类似的方法,但正如我所怀疑的那样,它是不正确的:使用mySQL SELECT的结果作为匹配自然语言查询的输入,mysql,nlp,match-against,against,Mysql,Nlp,Match Against,Against,我需要用自然语言对一个mySQL表字段进行研究,将另一个表字段的值作为输入。我尝试了类似的方法,但正如我所怀疑的那样,它是不正确的: SELECT id, name, MATCH(name), AGAINST ( SELECT name FROM table2 ) AS score FROM table1 WHERE MATCH(name), AGAINST ( S
SELECT id, name, MATCH(name),
AGAINST
(
SELECT name
FROM table2
) AS score
FROM table1
WHERE MATCH(name),
AGAINST
(
SELECT name
FROM table2
)
有什么想法吗
更新1
我遵循了下面的示例,但得到了错误“#1064-SQL查询语法错误,靠近'tb2'。我看不出这个语法错误。下面是我正在测试的代码:
SELECT name, MATCH(name) AGAINST
(
(SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name) tb2
) AS score
FROM
(
SELECT alias_name as name
FROM temp_active_ingredients_aliases
)
WHERE MATCH(name) AGAINST
(
(SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tb3
GROUP BY name
HAVING count(*) = 1
ORDER BY name) tb4
)
内部查询返回至少一个临时活性成分别名字段不完全匹配的活性成分列表.name。所以我通过自然语言全文研究尝试了一个不完全匹配的名字和别名的匹配。需要注意的是,以下内部查询工作正常:
SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name
我很确定这个语法错误很愚蠢,但我看不出来
更新2
这里是指向生成两个表(模式和一些数据)的代码的链接
SELECT
name,
MATCH (name) AGAINST (( SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name) ) AS score
FROM
(SELECT
alias_name AS name
FROM
temp_active_ingredients_aliases) db2
WHERE
MATCH (name) AGAINST (( SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name) )
请提供样品数据和所需的输出非常感谢你。你能给我们一些口译技巧吗?您在自然语言中添加了子句,可能会强制将结果索引为自然语言类型irhgt?团体会议和需求如何?谢谢again@fede72bari我添加了一些文本,以便解释我的决定。由于您没有发布样本数据,我做了一些假设,这样您至少有一个工作样本,您可以在其中添加自己的内容来进行实验。请别忘了是的当然非常感谢你,我只是想问一下,因为我发现关于GROUP_CONCAT的文档有点晦涩,但我还没有完全理解它的含义和需要。我的示例2中有很多行,但是匹配需要一个字符串,如果所有值都是,这就是为什么有es作为GroupConcat欢迎您,您正在尝试的是非常高级的,如果您了解sql ans mysql是如何工作的,那么它需要很多知识。当你想向某人展示你的proolem或尝试一些在你家的电脑上不起作用的东西时,需要使用dbfiddle。mysql workbench会向您显示所有语法错误,即使没有显示确切的点,但至少您知道还有工作要做
INSERT INTo table1 VALUES(1,'text1')
CREATE TABLE table2
(id int,
name text)
INSERT INTO table2 VALUES(1,'text1'),(2,'text2')
SELECT t1.id, t1.name, MATCH(t1.name)
AGAINST
(
(SELECT GROUP_CONCAT(name)
FROM table2) IN NATURAL LANGUAGE MODE
) AS score
FROM table1 t1
WHERE MATCH(t1.name)
AGAINST
(
(SELECT GROUP_CONCAT(name)
FROM table2) IN NATURAL LANGUAGE MODE
)
id | name | score
-: | :---- | -------------------------:
1 | text1 | 0.000000001885928302414186
SELECT t1.id, t1.name, MATCH(t1.name)
AGAINST
(
(SELECT GROUP_CONCAT(name SEPARATOR ' ')
FROM table2) IN NATURAL LANGUAGE MODE
) AS score
FROM table1 t1
WHERE MATCH(t1.name)
AGAINST
(
(SELECT GROUP_CONCAT(name SEPARATOR ' ')
FROM table2) IN NATURAL LANGUAGE MODE
)
id | name | score
-: | :---- | -------------------------:
1 | text1 | 0.000000001885928302414186
SELECT
name,
MATCH (name) AGAINST ((SELECT
name
FROM
(SELECT
name
FROM
active_ingredients UNION ALL SELECT
active_ingredients.name AS name
FROM
active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name) tbl
GROUP BY name
HAVING COUNT(*) = 1
ORDER BY name) ) AS score
FROM
(SELECT
alias_name AS name
FROM
temp_active_ingredients_aliases) db2
WHERE
MATCH (name) AGAINST ((SELECT
name
FROM
(SELECT
name
FROM
active_ingredients UNION ALL SELECT
active_ingredients.name AS name
FROM
active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name) tb3
GROUP BY name
HAVING COUNT(*) = 1
ORDER BY name) )
SELECT
name,
MATCH (name) AGAINST (( SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name) ) AS score
FROM
(SELECT
alias_name AS name
FROM
temp_active_ingredients_aliases) db2
WHERE
MATCH (name) AGAINST (( SELECT name
FROM
(
SELECT name
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name) )