我正在为我的网站制作搜索功能,该搜索功能可以从数据库中找到相关结果。我正在寻找一种计算单词出现次数的方法,但我需要确保单词的两边都有单词边界(所以当我想要“rip”时,我不会以“三重”结束)。
有没有人有任何想法?
人们误解了我的问题:
如何计算单行中 的出现次数?
答案 0 :(得分:2)
这不是关系数据库非常擅长的东西,除非你可以使用全文索引,并且你已经说过你不能,因为你正在使用InnoDB。我建议您选择相关的行并在应用程序代码中执行单词计数。
答案 1 :(得分:1)
你可以试试这种变态的方式:
SELECT
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
答案 2 :(得分:1)
您可以使用REPLACE()
克服mysql区分大小写的LOWER()
函数的问题。
它草率,但在我看来这个查询运行得非常快。
为了加快速度,我在select'中检索结果集,该select在我的'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
答案 3 :(得分:1)
创建这样的用户定义函数并在查询中使用它
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 ;
希望它有所帮助 Refer This
答案 4 :(得分:0)
这样的事情应该有效:
从表中选择count(*),其中fieldname REGEXP'[[:<:]] word [[:>:]]';
血淋淋的细节在MySQL手册的第11.4.2节中。
答案 5 :(得分:0)
像LIKE或REGEXP这样的东西不会缩放(除非它是最左边的前缀匹配)。
请考虑使用 fulltext index 来完成您的工作。
select count(*) from yourtable where match(title, body) against ('some_word');
答案 6 :(得分:0)
我使用了以下链接中描述的技术。该方法使用MySQL的length
和replace
函数。
答案 7 :(得分:0)
如果你想要搜索我会建议像Sphinx或Lucene这样的东西,我发现Sphinx(作为一个独立的全文索引器)更容易设置和运行。它运行速度很快,并且可以非常快速地生成索引。即使您使用MyISAM我建议使用它,它比MyISAM的全文索引功能强大得多。
它也可以(稍微)与MySQL集成。
答案 8 :(得分:-3)
这取决于您使用的DBMS,有些允许编写可以执行此操作的UDF。