在mysql上进行自定义全文搜索(制作索引文件)

时间:2011-04-19 10:47:25

标签: mysql indexing full-text-search

我想制作自己的自定义全文搜索,我不确定制作索引表的最佳方法是什么。

好的,我接受文本字段并将所有长于3的单词提取到索引表中。但是我需要存储什么呢?单词,我正在搜索的表的ID?还要别的吗?这个词的频率?

支持问题:如何将文本字段拆分为单词,是否有任何mysql函数或者我应该使用服务器端语言执行此操作?

更新:说清楚:我不需要全文搜索只是我文本字段所有记录中单词的单词列表,所以我可以用LIKE'word%'

3 个答案:

答案 0 :(得分:4)

如果您只是要实现MySQL调用boolean mode(无关联计数),则应实现以下基本功能:

  1. A wordbreaker,一种将字符串拆分为单词的算法。这在英语中是微不足道的,但对于一些不在单词之间使用空格的亚洲语言来说可能是一个问题。

  2. (可选)stemmer,一种将单词缩减为基本形式的算法,以便wentgone成为go

  3. (可选)spellchecker,一种纠正常见拼写错误的算法。

  4. 可选择使用thesaurus,将同义词缩减为常用形式。

  5. 所有这一切的结果是你有一个这样的字符串:

    a fast oburn vixen jmups over an indolent canine
    

    拆分为替换同义词并纠正错误的单词的基本形式:

    quick
    brown
    fox
    jump
    over
    lazy
    dog
    

    然后,您只需在(word, rowid)上创建一个综合索引,其中word是基本格式,rowid是索引记录的PRIMARY KEY

    要查询'+quick +fox',您应该在索引中搜索这些字词,然后在rowid上找到一个交叉点。相交的rowid将包含两个单词。

    如果您要考虑相关性,则还应在整个语料库的单独索引中维护每个单词的统计信息。

    我应该警告你,这不是一项简单的任务。只需查看Sphinx源代码。

答案 1 :(得分:2)

不要这样做
除非你知道你在做什么,否则忘记滚动你自己的全文搜索 让MySQL做繁重的工作。

  1. 将MyISAM用于您要搜索的表格
  2. 在要编制索引的文本字段上添加FULLTEXT索引。
  3. 然后做

    SELECT *, MATCH(field1, field2) AGAINST 'text to search' 
      IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION AS relevancy 
    FROM table1 
    WHERE MATCH(field1, field2) AGAINST 'text to search' 
      IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
    ORDER BY relevancy
    

    请参阅:http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_match

答案 2 :(得分:0)

OP表示他想搜索单词结尾。

我居住的地方(荷兰)我们在十二月做诗,所以我做了很多结束搜索以找到ryhme的词。 这是我的伎俩。

在名为visa_versa: varchar indexed

的表格中添加新字段
UPDATE mytable SET mytable.visa_versa = REVERSE(mytable.myword);

现在,您可以使用

对单词结尾进行索引搜索
SET @ending = 'end';
SELECT myword FROM mytable where visa_versa LIKE REVERSE(CONCAT('%',@ending));