Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Regex_Count - Fatal编程技术网

计算MySQL中一行中某个单词的出现次数

计算MySQL中一行中某个单词的出现次数,mysql,regex,count,Mysql,Regex,Count,我正在为我的网站做一个搜索功能,它可以从数据库中找到相关的结果。我正在寻找一种计算单词出现次数的方法,但我需要确保单词的两边都有单词边界,这样当我想要rip时就不会以三元组结束 有人有什么想法吗 人们误解了我的问题: 如何计算一行中此类事件的数量?类似的方法应该可以: 从表中选择count*,其中fieldname REGEXP'[[::]]' 血淋淋的细节在MySQL手册的11.4.2节中。like或REGEXP之类的东西不会缩放,除非它是最左边的前缀匹配 考虑用一个简单的方法来完成你想做的事

我正在为我的网站做一个搜索功能,它可以从数据库中找到相关的结果。我正在寻找一种计算单词出现次数的方法,但我需要确保单词的两边都有单词边界,这样当我想要rip时就不会以三元组结束

有人有什么想法吗

人们误解了我的问题:


如何计算一行中此类事件的数量?

类似的方法应该可以:

从表中选择count*,其中fieldname REGEXP'[[::]]'


血淋淋的细节在MySQL手册的11.4.2节中。

like或REGEXP之类的东西不会缩放,除非它是最左边的前缀匹配

考虑用一个简单的方法来完成你想做的事情

select count(*) from yourtable where match(title, body) against ('some_word');

我使用了下面链接中描述的技术。该方法使用MySQL的length和replace函数


你可以尝试这种反常的方式:

SELECT 
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
此查询可能非常慢 它看起来很难看 替换区分大小写
这不是关系数据库非常擅长的事情,除非您可以使用全文索引,并且您已经声明您不能,因为您使用的是InnoDB。我建议您选择相关行并在应用程序代码中进行字数计算。

您可以通过使用LOWER来克服mysql区分大小写的替换函数的问题

这很草率,但在我这方面,这个查询运行得相当快

为了加快速度,我在select中检索resultset,我在“outer”查询中将其声明为派生表。由于mysql在这一点上已经有了结果,所以replace方法工作得非常快

我创建了一个类似于下面的查询,用于在多个表和多个列中搜索多个术语。我获得一个“相关性”数字,该数字等于所有搜索列中所有已找到搜索词的所有发生次数之和

SELECT DISTINCT ( 
((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('there'),''))) / length('there')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('there'),''))) / length('there'))
 + ((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('another'),''))) / length('another')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('another'),''))) / length('another')) 
) as relevance, 
x.ent_type, 
x.ent_id, 
x.this_id as anchor,
page.page_name
FROM ( 
(SELECT 
'Foo' as ent_type, 
sp.sp_id as ent_id, 
sp.page_id as this_id, 
sp.title as ent_title, 
sp.content as ent_content,
sp.page_id as page_id
FROM sp
WHERE (sp.title LIKE '%there%' OR sp.content LIKE '%there%' OR sp.title LIKE '%another%' OR sp.content LIKE '%another%' ) AND (sp_content.title NOT LIKE '%goes%' AND sp_content.content NOT LIKE '%goes%')
) UNION (
  [search a different table here.....]
)
) as x
JOIN page ON page.page_id = x.page_id 
WHERE page.rstatus = 'ACTIVE'
ORDER BY relevance DESC, ent_title;
希望这对别人有帮助


-Seacrest out

这取决于您使用的数据库管理系统,有些数据库允许编写可以做到这一点的自定义项。

如果您需要搜索,我建议使用Sphinx或Lucene之类的搜索工具,我发现Sphinx作为独立的全文索引器更易于设置和运行。它运行得很快,生成索引的速度也很快。即使您使用的是MyISAM,我也建议您使用它,它比MyISAM的全文索引功能强大得多


它还可以与MySQL进行某种程度的集成。

创建这样一个用户定义的函数,并在查询中使用它

DELIMITER $$

CREATE FUNCTION `getCount`(myStr VARCHAR(1000), myword VARCHAR(100))
    RETURNS INT
    BEGIN
    DECLARE cnt INT DEFAULT 0;
    DECLARE result INT DEFAULT 1;

    WHILE (result > 0) DO
    SET result = INSTR(myStr, myword);
    IF(result > 0) THEN 
        SET cnt = cnt + 1;
        SET myStr = SUBSTRING(myStr, result + LENGTH(myword));
    END IF;
    END WHILE;
    RETURN cnt;    

    END$$

DELIMITER ;
希望能有帮助

无法进行全文索引。。。我正在使用InnoDB。这将检查有多少行包含搜索字符串。提问者希望计算每行中包含搜索字符串的频率。这将计算字符串,而不是单词。这将计算字符串,而不是单词。