使用 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 的代码的链接(模式和一些数据)

耀快到了

进一步解释一下。

  1. 你在 match(name) 后面放了一个错误的逗号。
  2. GROUP_CONCAT 在那里是因为 MySQL 需要一个单词列表,这是实现该列表的最简单方法,有关 FulltextaSearch 和优化的更多信息,请参阅 manual 当你在示例中看到 space 作为分隔符不会改变任何东西
  3. 自然语言模式只是我的一个假设,正如你写的那样自然语言研究所有其他选项也在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) )