我想制作自己的自定义全文搜索,我不确定制作索引表的最佳方法是什么。
好的,我接受文本字段并将所有长于3的单词提取到索引表中。但是我需要存储什么呢?单词,我正在搜索的表的ID?还要别的吗?这个词的频率?
支持问题:如何将文本字段拆分为单词,是否有任何mysql函数或者我应该使用服务器端语言执行此操作?
更新:说清楚:我不需要全文搜索只是我文本字段所有记录中单词的单词列表,所以我可以用LIKE'word%'
答案 0 :(得分:4)
如果您只是要实现MySQL
调用boolean mode
(无关联计数),则应实现以下基本功能:
A wordbreaker
,一种将字符串拆分为单词的算法。这在英语中是微不足道的,但对于一些不在单词之间使用空格的亚洲语言来说可能是一个问题。
(可选)stemmer
,一种将单词缩减为基本形式的算法,以便went
和gone
成为go
。
(可选)spellchecker
,一种纠正常见拼写错误的算法。
可选择使用thesaurus
,将同义词缩减为常用形式。
所有这一切的结果是你有一个这样的字符串:
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做繁重的工作。
FULLTEXT
索引。然后做
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)
我居住的地方(荷兰)我们在十二月做诗,所以我做了很多结束搜索以找到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));