使用 mySQL SELECT 的结果作为 MATCH AGAINST 自然语言查询的输入
Use results of a mySQL SELECT as input of a MATCH AGAINST natural language query
我需要通过自然语言对 mySQL table 字段进行研究,并将另一个 table 字段的值作为输入。我尝试了类似的方法,但正如我所怀疑的那样,它是不正确的:
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 query syntax error near '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
)
内部查询 return active_ingredients.name 的列表,这些列表至少与 temp_active_ingredients_alieases.alias_name 字段之一不完全匹配。这样我就可以尝试通过自然语言 FULLTEXT 研究将不完全匹配的名称与 alias_name(s) 进行匹配。请注意,以下内部查询正常工作:
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
这里是生成两个 table 的代码的链接(模式和一些数据)
耀快到了
进一步解释一下。
- 你在 match(name) 后面放了一个错误的逗号。
- GROUP_CONCAT 在那里是因为 MySQL 需要一个单词列表,这是实现该列表的最简单方法,有关 FulltextaSearch 和优化的更多信息,请参阅 manual 当你在示例中看到 space 作为分隔符不会改变任何东西
- 自然语言模式只是我的一个假设,正如你写的那样自然语言研究所有其他选项也在link解释
CREATE TABLE table1
(id int,
name text,
FULLTEXT(name))
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
db<>fiddle here
我纠正了你的错误
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) )
没有合适的datqa,我无法测试,只能排除语法错误
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) )
我需要通过自然语言对 mySQL table 字段进行研究,并将另一个 table 字段的值作为输入。我尝试了类似的方法,但正如我所怀疑的那样,它是不正确的:
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 query syntax error near '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
)
内部查询 return active_ingredients.name 的列表,这些列表至少与 temp_active_ingredients_alieases.alias_name 字段之一不完全匹配。这样我就可以尝试通过自然语言 FULLTEXT 研究将不完全匹配的名称与 alias_name(s) 进行匹配。请注意,以下内部查询正常工作:
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
这里是生成两个 table 的代码的链接(模式和一些数据)
耀快到了
进一步解释一下。
- 你在 match(name) 后面放了一个错误的逗号。
- GROUP_CONCAT 在那里是因为 MySQL 需要一个单词列表,这是实现该列表的最简单方法,有关 FulltextaSearch 和优化的更多信息,请参阅 manual 当你在示例中看到 space 作为分隔符不会改变任何东西
- 自然语言模式只是我的一个假设,正如你写的那样自然语言研究所有其他选项也在link解释
CREATE TABLE table1 (id int, name text, FULLTEXT(name))
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
db<>fiddle here
我纠正了你的错误
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) )
没有合适的datqa,我无法测试,只能排除语法错误
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) )