带有字边界的MySQL全文搜索

时间:2016-01-15 11:27:03

标签: mysql

我已经阅读了一些articlesissues,但无法找到令人满意的解决方案。我想在用户填写表单时从数据库中选择相关记录;以同样的方式,当您提出问题时,该功能在此网站上有效。

考虑列subject

中包含以下三个记录的数据库表
+---+---------------------------------------------------+
| 1 | Pagina aanmaken en beter doorzoekbaar maken       |
+---+---------------------------------------------------+
| 2 | Sorteerfunctie uitbreiden in zoek-en-boek functie |
+---+---------------------------------------------------+
| 3 | Zoek de verschillen tussen de pagina's            |
+---+---------------------------------------------------+

我使用单词zoek启动搜索查询,因此我想在术语zoek上查询数据库中最相关的结果。我提出了以下问题:

SELECT 
    id, 
    subject, 
    MATCH(
        subject
    ) 
    AGAINST(
        'zoek*'
        IN BOOLEAN MODE
    ) 
    AS 
        score
FROM 
    Issues 
WHERE 
    MATCH(
        subject
    ) 
    AGAINST(
        'zoek*'
        IN BOOLEAN MODE
    )

当我运行此查询时,我希望显示所有记录并且(可能,我不知道MySQL中的特异性如何工作)ID 3显示在顶部(因为确切的单词匹配)。

相反,查询结果只有行23,得分完全相同(0.031008131802082062)。

我需要在查询中更改哪些内容才能匹配相应的记录?还要考虑用户可以输入关键字或句子。

5 个答案:

答案 0 :(得分:2)

MySQL全文搜索不支持后缀。

要获得第一行,您必须与目前不允许的'* zoek *'进行匹配。

另一种方法是使用

SELECT id, subject
FROM Issues 
WHERE subject LIKE '%zoek%' 

答案 1 :(得分:1)

尝试此查询以获得不同的结果:

  1. 选择以字母“z”开头的所有主题:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE 'z%';

  2. 选择以字母“z”结尾的所有主题:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%z';

  3. 选择包含“zoek”模式的所有主题:
    SELECT ID, Subject FROM table_name WHERE Subject LIKE '%zoek%';

答案 2 :(得分:1)

正如其他人所建议的那样,MySQL的FULLTEXT索引不支持前导通配符,因此无法帮助搜索后缀。

但是,新的ngram Full-Text Parser可能有所帮助:

  

内置的MySQL全文解析器使用单词之间的空格作为分隔符来确定单词的开始和结束位置,这在使用不使用单词分隔符的表意语言时是一个限制。为了解决这个限制,MySQL提供了一个ngram全文解析器(...)。

     

ngram是来自给定文本序列的n个字符的连续序列。 ngram解析器将一系列文本标记为一个由n个字符组成的连续序列。

由于我从未使用过这个功能,所以我对这个话题无能为力。但请注意:

  

由于ngram FULLTEXT索引仅包含ngrams,并且不包含有关术语开头的信息,因此通配符搜索可能会返回意外结果。

答案 3 :(得分:0)

...对不起

根据MySQL FULLTEXT的定义,单词(doorzoekbaar)的中间部分不会被找到。 FULLTEXT没有"复合名词"的概念,所以它不会尝试分开这个词。

" word"的定义在FULLTEXT中提供' dash'和'空间'相同的意思 - 即一个单词边界。因此,zoek de...zoek-...的权重相同。

查看Solr,Lucene和其他第三方"全文解决方案"。他们可能(或可能不)提供您想要的东西。

zoek*+zoek*,与IN BOOLEAN MODE 一起运行会找到zoekbaar

答案 4 :(得分:0)

你的案子有一个工作区:

SELECT 
    id, 
    subject, 
    IF (subject LIKE "zoek %" OR subject LIKE "% zoek %" OR subject LIKE "% zoek", 
        1, 
        IF (subject LIKE "% zoek%",
            0.5,
            IF (subject LIKE "%zoek%",
                0.2,
                0)
            )
        ) as score
FROM 
    Issues 
WHERE subject LIKE "%zoek%"
ORDER by score DESC

预期结果:

+---+---------------------------------------------------+------+
|id |   subject                                         |score |    
+---+---------------------------------------------------+------+
|3  | Zoek de verschillen tussen de pagina's            | 1    |
+---+---------------------------------------------------+------+
|2  | Sorteerfunctie uitbreiden in zoek-en-boek functie | 0.5  |
+---+---------------------------------------------------+------+
|1  | Pagina aanmaken en beter doorzoekbaar maken       | 0.2  |
+---+---------------------------------------------------+------+