我想做我自己的自定义全文搜索,但我不确定什么是最好的方法来制作索引表。
好的,我从文本字段中提取出所有长度大于3的单词到索引表中。但是我需要存储关于它们的什么呢?word,我正在搜索的表的ID?还要别的吗?单词出现的频率是多少?
和支持问题:如何将文本字段拆分成单词,有没有mysql函数,或者我应该使用服务器端语言来做这件事?
更新:为了让事情更清楚:我不需要全文搜索,只需要我的文本字段中所有记录中的单词的单词列表,这样我就可以用LIKE 'word%‘搜索结尾
发布于 2011-04-19 19:10:36
如果您只打算实现MySQL所称的boolean mode (无相关性计数),则应实现以下基本功能:
wordbreaker,一种将字符串拆分成单词的算法。这在英语中是微不足道的,但对于一些亚洲语言来说,这可能是一个问题,因为这些语言不使用words.went之间的空格,这是一种将单词简化为基本形式的算法,因此gone和spellchecker都变成了thesaurus a,这是一种纠正常见拼写的算法errors.
spellchecker,它将同义词减少为它们的常见形式。所有这一切的结果就是你得到了一个类似这样的字符串:
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的源代码就知道了。
发布于 2011-04-19 19:01:27
不要这样做
除非你知道你在做什么,否则忘了滚动你自己的全文搜索吧。
让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
发布于 2011-04-19 20:27:24
OP表示他想搜索单词结尾。
我住的地方(荷兰)我们在12月份写诗,所以我做了很多单词结尾的搜索,以找到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)); https://stackoverflow.com/questions/5715191
复制相似问题