然后使用特殊的MySQL方法在那些字段运行搜索新葡京32450网址,忽然发现会报一个date类型的字段的默认值错误

发布时间:2019-09-12  栏目:数据  评论:0 Comments

2.如果没有SQL_MODE,就添加,有就修改一下

您还可以使用这种方法来查找至少一个传递到AGAINST的参数中,以下的例子查找了至少包含单词“hell”和“rocks”中的一个的记录:

五、与全文检索相关的系统变量:
     ft_min_word_len = 全文检索的最小许可字符(默认4,通过 SHOW
VARIABLES LIKE ‘ft_min_word_len’ 可查看),
     中文通常是两个字就是一个词,所以做中文的话需要修改这个值为2最好。

七、实验部分

  1. 可能遇到的困扰

3.重启MySQL;

mysql> SELECT id FROM reviews WHERE MATCH (data) AGAINST (‘hot*’ IN BOOLEAN MODE);+—-+

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple banana’ IN BOOLEAN MODE);
        
返回记录必须包含apple,同时banana可包含也可不包含,若包含的话会获得更高的权重。

◆ 步骤5 搜索语法规则、排序 实验
   说明:匹配语句 MATCH (col1,col2,…) AGAINST (expr
[search_modifier]) 匹配完成后,会返回此条数据的权重值(权重值1 ≈
各个词的匹配结果权重值之和),我们利用此权重值“由高到低”排序可优化查询结果。

INSERT INTO articles (title,body) VALUES
    (‘MySQL Tutorial’,’DBMS stands for DataBase …’),
    (‘How To Use MySQL Well’,’After you went through a …’),
    (‘Optimizing MySQL’,’In this tutorial we will show …’),
    (‘1001 MySQL Tricks’,’1. Never run mysqld as root. 2. …’),
    (‘MySQL vs. YourSQL’,’In the following database comparison …’),
    (‘MySQL Security’,’When configured properly, MySQL …’);

在给一个表添加字段的时候,忽然发现会报一个date类型的字段的默认值错误,郁闷~

+—-+

     2、布尔检索: IN BOOLEAN MODE
         
剔除一半匹配行以上都有的词,譬如说,每个行都有this这个字的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,
         
原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);但是若只有两行记录时,是啥鬼也查不出来的,
          因为每个字都出现50%(或以上),要避免这种状况,请用IN BOOLEAN
MODE。

       ● IN BOOLEAN MODE的特色: 
          ·不剔除50%以上符合的row。 
          ·不自动以相关性反向排序。 
          ·可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 
          ·限制最长与最短的字符串。 
          ·套用Stopwords。
 
       ● 搜索语法规则:
         +   一定要有(不含有该关键词的数据条均被忽略)。 
         –   不可以有(排除指定关键词,含有该关键词的均被忽略)。 
         >   提高该条匹配数据的权重值。 
         <   降低该条匹配数据的权重值。
         ~   将其相关性由正转负,表示拥有该字会降低相关性(但不像 –
将之排除),只是排在较后面权重值降低。 
         *   万用字,不像其他语法放在前面,这个要接在字符串后面。 
         ” ” 用双引号将一段句子包起来表示要完全相符,不可拆字。

   到目前为止都很顺利,但是如果检索SQL改为下面会怎样呢?

经过排查,原来是MySQL的配置问题,在wamp下,MySQL
5.7里是没有设置 SQL_MODE 的。

mysql> INSERT INTO `reviews` (`id`, `data`) VALUES

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple +(>banana <orange)’ IN BOOLEAN MODE);
         返回必须同时包含“apple banana”或者必须同时包含“apple
orange”的记录。
         若同时包含“apple banana”和“apple orange”的记录,则“apple
banana”的权重高于“apple orange”的权重。

  

   ▶ 实验11:同时对 title_fc 和 content_fc 两字段做全文检索

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score,MATCH (content_fc) AGAINST (‘optimizing ok red blue’) as
content_score
   FROM zzx_articles 
   WHERE MATCH (title_fc,content_fc) AGAINST (‘optimizing ok red blue’
IN BOOLEAN MODE) order by title_score DESC,content_score DESC

   新葡京32450网址 1

   总结:通过实验发现,又成功的取到了 content_fc
字段匹配的权重值,排序方式是首要按title字段权重降序排序,次要按
content_fc 权重降序排序。
           另外我发现 ok 这个关键词在对“title_fc
char(254)”字段匹配时得到匹配值为2.1xxxxxxx,但对“content_fc
text”字段匹配时权重值去为0,
          
这是MySQL对各英文单词权重值的给予有自己的算法,我们无权干涉。所以当我们发现有些单词的权重值为零甚至为负时,不用过于纠结,
           因为MySQL有自己的算法。

           关于排序,首要按 title_score 字段权重降序排序,次要按
content_score
权重降序排序,这样的排序规则看起来更科学了,但我想优秀的搜索引擎绝不至于简单如此吧,继续下面的实验:

  1. 全文检索测试

1.my.ini文件中找到 [mysqld]

4、使用逻辑搜索修饰符(Boolean search modifiers)

    3、查询扩展检索: WITH QUERY EXPANSION

三、检索方式
     1、自然语言检索: IN NATURAL LANGUAGE MODE

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST (‘well’ IN BOOLEAN MODE );

sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

以上的这些例子演示了相对于传统的SELECT…LIKE语句,进行全文搜索的更有效的方法,当您下一次需要编写MySQL数据库搜索界面的时候,您可以尝试这一方法。

  

   ▶ 实验1:只对 title_fc 索引字段做全文检索,并显示每条数据的权重值

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   新葡京32450网址 2

   总结:1.当没有加 + –
这样的过滤符号时,这些关键词是“或(or)”的关系,即:要么匹配optimizing,要么匹配ok,要么匹配red,要么匹配blue。
           2.通过上面实验,发现当某条数据有多个关键词匹配时(如:red
blue),此条数据的权重值会略高:
              此条数据权重值 ≈ optimizing权重值 + ok权重值 + red权重值 +
blue权重值
             
理论上来说,当一条数据能匹配上的关键词越多,则此条数据的权重值越高,排名越靠前。

     3、MATCH(title, content)里的字段必须和FULLTEXT(title,
content)里的字段一模一样。
          如果只要单查title或content一个字段,那得另外再建一个
FULLTEXT(title) 或
FULLTEXT(content),也因为如此,MATCH()的字段一定不能跨table,但是另外两种搜寻方式好像可以。
    
    
4、MySQL不支持中文全文索引,原因很简单:与英文不同,中文的文字是连着一起写的,中间没有MySQL能找到分词的地方,截至目前MySQL5.6版本是如此,但是有变通的办法,就是将整句的中文分词,并按urlencode、区位码、base64、拼音等进行编码使之以“字母+数字”的方式存储于数据库中。

mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW
VARIABLES LIKE ‘ft_min_word_len’
来查看指定的字符长度,也可以在mysql配置文件my.ini
更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len =
2,改完后重启mysql即可。  
所以上面不能返回结果。但是我用上面的方法改配置文件并重启MySQL服务器后,再用show命令查看,并没有改变。

These guys totally rock! Like, awesome, dude!’);

◆ 步骤2 创建数据库(视情况可跳过此步)
CREATE DATABASE search DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;

插入结果如下图:
新葡京32450网址 3

  1. MySQL
    4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型

|  2 |

  

   ▶
实验3:过滤条件:必须包含”red”关键词,如果匹配到的行中还含有”blue”关键词,则会对此条数据增加权重:

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red blue’ IN BOOLEAN
MODE) order by title_score DESC

   或下面写法:
   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red >blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red >blue’ IN
BOOLEAN MODE) order by title_score DESC

   新葡京32450网址 4

  
总结:与实验2比较,当包含了red的行中,若也包含blue关键词,权重确实增加了(如:id=4这条)。

    3、查询扩展检索: WITH QUERY EXPANSION

  1. 插入测试数据

2 rows in set (0.00 sec)

◆ 步骤3 创建数据表
CREATE TABLE `zzx_articles` (
`id` int(10) unsigned NOT NULL auto_increment, 
`title` char(254) default NULL COMMENT ‘标题’,
`content` text COMMENT ‘内容’,
`author` char(60) default NULL COMMENT ‘作者’,
`title_fc` char(254) default NULL COMMENT ‘标题的分词’,
`content_fc` text COMMENT ‘内容的分词’,
PRIMARY KEY  (`id`),
FULLTEXT KEY `zzx_title_fc` (`title_fc`),
FULLTEXT KEY `zzx_content_fc` (`content_fc`),
FULLTEXT KEY `zzx_title_con_fc` (`title_fc`,`content_fc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple +(>banana <orange)’ IN BOOLEAN MODE);
         返回必须同时包含“apple banana”或者必须同时包含“apple
orange”的记录。
         若同时包含“apple banana”和“apple orange”的记录,则“apple
banana”的权重高于“apple orange”的权重。

在我的理解中mysql本身就对中文支持不好,如果我们再在操作时有一点小不标准那么查出来的中文就更乱了,下面我来给大家介绍mysql中文模糊查找不精确解决办法

当MySQL收到了一个全文搜索的请求,它就在内部对每个记录进行评分,不匹配的记录得分为零,而“更相关”的记录会得到比“不太相关”的记录相对更高的分数。相关性是由MySQL的一系列区分标准来决定的,查看MySQL的用户手册可以得到更多的信息。

  

   ▶ 实验9:在实验1基础上,将blue的权重值忽视不要(注意与实验1比较)

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   新葡京32450网址 5

  
总结:在实验1的基础上,此时去除select字段条件里的blue关键词,但在where里去仍保留blue关键词。
            我的本意是想正常匹配“optimizing ok red
blue”这几个关键词,但不想得到blue的权重值(忽视blue的权重值)。
            查询的结果是含有blue关键词的数据的权重值会略降低了。
           
通过“降重”——忽略某些关键词权重值的方式可使部分数据权重值减小,进而影响排序。

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple ~banana’ IN BOOLEAN MODE);
         ~
是我们熟悉的异或运算符。返回记录必须包含apple,若也包含了banana会降低权重。
         但是它没有 +apple -banana
严格,因为后者如果包含banana压根就不返回。

select id,title,name from achech_com.news where binary title like ‘%a%’

(2, ‘Hello all, I really like the new Madonna single. 

  

   ▶ 实验6:过滤条件:匹配包含单词“red”和“Linux” 的行,或包含“red”
和“blue”的行(无先后顺序)
                然而包含 “apple Linux”的行较包含“apple
blue”的行有更高的权重值。

   SELECT *,MATCH (title_fc) AGAINST (‘+red  +(>Linux <blue)’)
as title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘+red  +(>Linux <blue)’ IN
BOOLEAN MODE) order by title_score DESC

   新葡京32450网址 6

  
—————————————————————————————————————————— 

   ▶ 实验7:过滤条件:匹配关键词以 re 开头,或以 bl 开头的数据行

   SELECT *,MATCH (title_fc) AGAINST (‘re* bl*’) as title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘re* bl*’ IN BOOLEAN MODE) order
by title_score DESC

   新葡京32450网址 7

   总结:注意 * 是写在后面哦,此时相当于 like 模糊匹配,没有权重值了

  
—————————————————————————————————————————— 

   ▶ 实验8:过滤条件:匹配查找字符串“To Use MySQL”关键词

   SELECT *,MATCH (title_fc) AGAINST (‘”To Use MySQL”‘) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘”To Use MySQL”‘ IN BOOLEAN MODE)
order by title_score DESC

   新葡京32450网址 8

   总结:此时是把双引号内的的字符串看成一个关键词,若不用双引号则是将 To
Use MySQL 三个关键词去分别匹配,两者有区别;

     2、布尔检索: IN BOOLEAN MODE
         
剔除一半匹配行以上都有的词,譬如说,每个行都有this这个字的话,那用this去查时,会找不到任何结果,这在记录条数特别多时很有用,
         
原因是数据库认为把所有行都找出来是没有意义的,这时,this几乎被当作是stopword(中断词);但是若只有两行记录时,是啥鬼也查不出来的,
          因为每个字都出现50%(或以上),要避免这种状况,请用IN BOOLEAN
MODE。

例如,通过“标题”对新闻库进行检索,关键字可能包含是中英文,如下SQL语句:

2 rows in set (0.00 sec)

       ● IN BOOLEAN MODE的特色: 
          ·不剔除50%以上符合的row。 
          ·不自动以相关性反向排序。 
          ·可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 
          ·限制最长与最短的字符串。 
          ·套用Stopwords。
 
       ● 搜索语法规则:
         +   一定要有(不含有该关键词的数据条均被忽略)。 
         –   不可以有(排除指定关键词,含有该关键词的均被忽略)。 
         >   提高该条匹配数据的权重值。 
         <   降低该条匹配数据的权重值。
         ~   将其相关性由正转负,表示拥有该字会降低相关性(但不像 –
将之排除),只是排在较后面权重值降低。 
         *   万用字,不像其他语法放在前面,这个要接在字符串后面。 
         ” ” 用双引号将一段句子包起来表示要完全相符,不可拆字。

  

   
   ▶
实验5:过滤条件:必须包含”red”关键词,如果匹配到的行中还包含”blue”关键词则降低此条数据权重

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok +red ~blue’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok +red ~blue’ IN
BOOLEAN MODE) order by title_score DESC

   新葡京32450网址 9

   总结:这个实验没有看到明显效果,但 ~ 过滤符确实是降低此权重符

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST (‘+apple banana’ IN BOOLEAN MODE);  
必须包含apple,但是如果同时也包含banana则会获得更高的权重。

Query OK, 3 rows affected (0.21 sec)

完成后“重启 MySQL 服务”,并用 SHOW VARIABLES LIKE ‘ft_min_word_len’
查询下是否得到了正确的结果值为2,如下图:
新葡京32450网址 10

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘apple banana’ IN BOOLEAN MODE);
        
apple和banana之间是空格,空格表示OR。即:返回记录至少包含apple、banana中的一个。

解决方法,使用 BINARY 属性进行检索:

您还可以使用逻辑搜索修饰符来进行更精确的搜索,这通过在AGAINST语句中添加特殊的IN BOOLEAN MODE修饰符来实现,在以下的例子中,将查找含有单词“single”但是没有“Madonna”的记录:

# 修改全文检索的最小许可字符为2个字符或汉字
ft_min_word_len = 2

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘+apple -banana’ IN BOOLEAN MODE);
         + 表示AND,即必须包含。-
表示NOT,即必须不包含。即:返回记录必需包含 apple,且不能包含 banner。

 

3、运行全文搜索

◆ 步骤4 插入测试数据
INSERT INTO `zzx_articles` (title_fc,content_fc) VALUES
(‘MySQL Tutorial Linux red’,’DBMS stands for DataBase ok’),
(‘How To Use MySQL Well’,’After you went through blue’),
(‘Optimizing MySQL ok’,’In this tutorial we will optimizing’),
(‘MySQL vs this YourSQL blue red’,’1. Never run mysqld as root red’),
(‘MySQL Tricks blue’,’In the following database’),
(‘MySQL Security’,’When configured properly, MySQL’),
(‘中华’,’中华人民共和国 ‘),
(‘中华情 和谐’,’上海 和谐’),
(‘污染之都’,’你好 我是 北京 人’),
(‘北京精神’,’创新 爱国 包容 厚颜’)

五、与全文检索相关的系统变量:
     ft_min_word_len = 全文检索的最小许可字符(默认4,通过 SHOW
VARIABLES LIKE ‘ft_min_word_len’ 可查看),
     中文通常是两个字就是一个词,所以做中文的话需要修改这个值为2最好。

  
假设well在所有记录中都出现,并且ft_min_word_len已经改为2,那么下面的SQL检索语句得到的结果集将包含所有记录:

mysql> CREATE TABLE reviews (id INT(5) PRIMARY KEY NOT NULL AUTO_INCREMENT, data TEXT);

         SELECT * FROM articles WHERE MATCH (title,content) AGAINST
(‘apple banana’ IN BOOLEAN MODE);
        
apple和banana之间是空格,空格表示OR。即:返回记录至少包含apple、banana中的一个。

  

   ▶
实验10:在实验9的基础上,在select字段条件里增加几个red关键词,where里的关键词保持不变(注意与实验1
实验9比较)。

   SELECT *,MATCH (title_fc) AGAINST (‘optimizing ok red red red’) as
title_score
   FROM zzx_articles 
   WHERE MATCH (title_fc) AGAINST (‘optimizing ok red blue’ IN BOOLEAN
MODE) order by title_score DESC

   新葡京32450网址 11

   总结:发现只要含有 red
关键词的数据的权重值都增加了,排序也发生了变化。
          
说明通过“提重”——重复多次某些关键词权重值的方式可使部分数据权重值增加,进而影响排序。

返回的结果,某些title字段确定带了“a”关键字,而有些则只有中文,但也随之返回在检索结果中。

验证数据的正确录入:

  

    ▶ 实验15:中文全文检索
     
MySQL不支持中文全文检索,因为中文一句话是连着写的,不像英文单词间有空格分隔。解决办法就是中文分词(关于中文分词请参阅其它文章),
     
如果你的MySQL是安装在Windows平台上的,可以不用转码直接存储中文就可以使用全文索引,如本例。但是如果你的MySQL是安装在Linux上的则需要进行转编码(urlencode
/ base64_encode / json_encode / 区位 /
拼音)等方案,具体方案参看其它博文。

      SELECT *,MATCH (title_fc) AGAINST (‘中华 北京 和谐 security’) as
title_score,MATCH (content_fc) AGAINST (‘中华 北京 和谐 security’) as
content_score,(case when MATCH (title_fc) AGAINST (‘中华 北京 和谐
security’) > 0 and MATCH (content_fc) AGAINST (‘中华 北京 和谐
security’) > 0 then ‘5’ when MATCH (title_fc) AGAINST (‘中华 北京
和谐 security’) > 0 and MATCH (content_fc) AGAINST (‘中华 北京 和谐
security’) = 0 then ‘4’ else ‘0’ end) as score1
      FROM zzx_articles 
      WHERE MATCH (title_fc,content_fc) AGAINST (‘中华 北京 和谐
security’ IN BOOLEAN MODE) order by score1 DESC,title_score
DESC,content_score DESC

新葡京32450网址 12

 

来源:

六、总结事项
     1、预设搜寻是不分大小写,若要分大小写,columne 的 character
set要从utf8改成utf8_bin。

select id,title,name from achech_com.news where binary ucase(title)
like ucase(‘%a%’)

mysql> SELECT id, MATCH (data) AGAINST (‘rock’) FROM reviews;

四、MySQL全文检索的条件限制
    
1、在MySQL5.6以下,只有MyISAM表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索。
     2、相应字段建立FULLTEXT索引

◆ 步骤2 创建数据库(视情况可跳过此步)
CREATE DATABASE search DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;

  1. 布尔全文检索语法

相关文章

留下评论

网站地图xml地图