使用mySQL SELECT的结果作为匹配自然语言查询的输入

使用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

我需要用自然语言对一个mySQL表字段进行研究,将另一个表字段的值作为输入。我尝试了类似的方法,但正如我所怀疑的那样,它是不正确的:

    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

这里是指向生成两个表(模式和一些数据)的代码的链接

姚就快到了

再进一步解释一下

  • 您在匹配项(名称)后面的那个位置放了一个错误的逗号
  • GROUP_CONCAT之所以在这里,是因为MySQL希望有一个单词列表,而这是实现这一点的最简单方法,有关FulltextaSearch和优化的更多信息,请参见示例中的空格分隔符不会改变任何内容
  • 在自然语言模式下,这只是我的一个假设,因为你们写了《自然语言》的研究报告,所有其他选项也在那个链接中解释过
  • 没有正确的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) )
    

    请提供样品数据和所需的输出非常感谢你。你能给我们一些口译技巧吗?您在自然语言中添加了子句,可能会强制将结果索引为自然语言类型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) )