Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql上进行自定义全文搜索(制作索引文件)_Mysql_Indexing_Full Text Search - Fatal编程技术网

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

在mysql上进行自定义全文搜索(制作索引文件),mysql,indexing,full-text-search,Mysql,Indexing,Full Text Search,我想做我自己的自定义全文搜索,但我不确定制作索引表的最佳方法是什么 好的,我获取文本字段并将所有长度超过3的单词提取到索引表中。但是我必须存储关于它们的什么呢?word,我正在搜索的表的ID?还有别的吗?单词的频率 和支持问题:我如何将文本字段拆分为单词,是否有mysql函数,或者应该使用服务器端语言来实现 更新:为了让事情更清楚:我不需要全文搜索,只需要搜索我文本字段中所有记录中的单词列表,这样我就可以搜索类似“word%”的结尾了。不要这样做。 除非您知道自己在做什么,否则请忘记滚动您自己的

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

好的,我获取文本字段并将所有长度超过3的单词提取到索引表中。但是我必须存储关于它们的什么呢?word,我正在搜索的表的ID?还有别的吗?单词的频率

和支持问题:我如何将文本字段拆分为单词,是否有mysql函数,或者应该使用服务器端语言来实现


更新:为了让事情更清楚:我不需要全文搜索,只需要搜索我文本字段中所有记录中的单词列表,这样我就可以搜索类似“word%”的结尾了。

不要这样做。
除非您知道自己在做什么,否则请忘记滚动您自己的全文搜索。
让我来做这件重担吧

  • 对要搜索的表使用MyISAM
  • 全文
    索引放在要索引的文本字段上
  • 那就做吧

    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
    

    请参阅:

    不要这样做
    除非您知道自己在做什么,否则请忘记滚动您自己的全文搜索。
    让我来做这件重担吧

  • 对要搜索的表使用MyISAM
  • 全文
    索引放在要索引的文本字段上
  • 那就做吧

    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
    

    请参阅:

    如果您只打算实现
    MySQL
    调用的
    布尔模式(无相关性计数),则应实现以下基本功能:

  • 一种
    分词器
    ,一种将字符串拆分为单词的算法。这在英语中并不重要,但对于一些不使用空格的亚洲语言来说可能是个问题

  • (可选)一个
    词干分析器
    ,这是一种将单词简化为基本形式的算法,这样
    go
    go
    都变成
    go

  • (可选)一个
    拼写检查器
    ,一种纠正常见拼写错误的算法

  • (可选)一个
    同义词表
    ,将同义词简化为它们的通用形式

  • 所有这些的结果是,您有一个如下字符串:

    a fast oburn vixen jmups over an indolent canine
    
    将单词分成基本形式,替换同义词并纠正错误:

    quick
    brown
    fox
    jump
    over
    lazy
    dog
    
    然后您只需在
    (word,rowid)
    上创建一个复合索引,其中
    word
    是基本形式,
    rowid
    是索引记录的
    主键

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

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


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

    如果您只想实现
    MySQL
    调用的
    布尔模式(无相关性计算),那么您应该实现以下基本功能:

  • 一种
    分词器
    ,一种将字符串拆分为单词的算法。这在英语中并不重要,但对于一些不使用空格的亚洲语言来说可能是个问题

  • (可选)一个
    词干分析器
    ,这是一种将单词简化为基本形式的算法,这样
    go
    go
    都变成
    go

  • (可选)一个
    拼写检查器
    ,一种纠正常见拼写错误的算法

  • (可选)一个
    同义词表
    ,将同义词简化为它们的通用形式

  • 所有这些的结果是,您有一个如下字符串:

    a fast oburn vixen jmups over an indolent canine
    
    将单词分成基本形式,替换同义词并纠正错误:

    quick
    brown
    fox
    jump
    over
    lazy
    dog
    
    然后您只需在
    (word,rowid)
    上创建一个复合索引,其中
    word
    是基本形式,
    rowid
    是索引记录的
    主键

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

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


    我要警告你,这不是一项简单的任务。请看一下斯芬克斯的源代码。

    OP表示他想搜索词尾

    在我居住的地方(荷兰),我们在12月份写诗,所以我做了大量的词尾搜索,以找到ryhme喜欢的词。
    这是我的窍门

    在表中添加一个名为
    visa\u versa:varchar index

    UPDATE mytable SET mytable.visa_versa = REVERSE(mytable.myword);
    
    现在,您可以使用

    SET @ending = 'end';
    SELECT myword FROM mytable where visa_versa LIKE REVERSE(CONCAT('%',@ending)); 
    

    OP表示他想搜索词尾

    在我居住的地方(荷兰),我们在12月份写诗,所以我做了大量的词尾搜索,以找到ryhme喜欢的词。
    这是我的窍门

    在表中添加一个名为
    visa\u versa:varchar index

    UPDATE mytable SET mytable.visa_versa = REVERSE(mytable.myword);
    
    现在,您可以使用

    SET @ending = 'end';
    SELECT myword FROM mytable where visa_versa LIKE REVERSE(CONCAT('%',@ending)); 
    

    为什么不想使用内置全文搜索?查看匹配:。我只需要word表。。。为什么不想使用内置全文搜索?查看匹配:。我只需要word表。。。Thanx,我不需要搜索,我只需要建立一个单词表,这样我就可以找到单词的结尾(长话短说)。我只需要一个文本字段中的单词表。啊哈,我建议你编辑你的问题以包含这个事实。这将使你的问题更容易给出一个好的答案。如果你反过来存储你的单词,你可以使用'like'xxx%'来搜索单词的结尾。Thanx,我不需要搜索,我只需要建立一个单词表,这样我就可以找到单词的结尾(长话短说)。我只想说一句话