MySQL全文索引
原理
依靠MySQL的fulltext类型索引来实现。
实现
生成标签
数据入库时进行分词,生成关键字标签;分词方法各语言各异,网上都有开源库,按需使用即可。
查询
查询时,先对问句进行分词,然后组装成SQL中的AGAINST参数值,AGAINST的规则如下:
+一个领头的加号表示,该词必须出现在每个返回的记录行中。
-一个领头的减号表示,该词必须不出现在每个返回的记录行中。
缺省的 (当既没有加号也没有负号被指定时)词是随意的,但是包含它的记录行将被排列地更高一点。这个模仿没有 IN BOOLEAN MODE 修饰词的 MATCH() … AGAINST() 的行为。
< >这两个操作符用于改变一个词的相似性值的基值。< 操作符减少基值,> 操作符则增加它。参看下面的示例。
( )圆括号用于对子表达式中的词分组。
~一个领头的否定号的作用象一个否定操作符,引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点,但是不会被完全的排除,因为这样可以使用 - 操作符。
*一个星号是截断操作符。不想其它的操作符,它应该被追加到一个词后,不加在前面。
“短语,被包围在双引号”中,只匹配包含这个短语(字面上的,就好像被键入的)的记录行。
这里是一些示例:
apple banana找至少包含上面词中的一个的记录行
+apple +juice… 两个词均在被包含
+apple macintosh… 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些
+apple -macintosh… 包含 “apple” 但不包含 “macintosh”
+apple +(>pie <strudel)… 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一点
apple*… 包含 “apple”,“apples”,“applesauce” 和 “applet”
“some words”… 可以包含 “some words of wisdom”,但不是 “some noise words”
示例:
SELECT * FROM
cfxf_questionWHERE MATCH (tags) AGAINST (‘002199 东晶电子’ IN BOOLEAN MODE)
问题
标签中有数据,查询结果却为空
有一些情况下,全文索引是不生效的:
1.标签过短(小于4个字符)
2.标签在50%以上的记录中出现