Количество вхождений слова в строку в MySQL
Я делаю функцию поиска для своего веб-сайта, которая находит соответствующие результаты из базы данных. Я ищу способ подсчета вхождений слова, но мне нужно убедиться, что есть границы слов с обеих сторон слова ( поэтому я не заканчиваю "тройным", когда хочу "разорвать").
У кого-нибудь есть идеи?
люди неправильно поняли мой вопрос:
Как я могу подсчитать количество таких вхождений в одном грести?
9 ответов
Это не та вещь, в которой реляционные базы данных очень хороши, если вы не можете использовать полнотекстовое индексирование, и вы уже заявили, что не можете, так как вы используете InnoDB. Я бы предложил выбрать соответствующие строки и выполнить подсчет слов в коде приложения.
вы можете попробовать этот извращенный способ:
SELECT
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
- этот запрос может быть очень медленным
- это выглядит довольно некрасиво
- REPLACE () чувствителен к регистру
создайте пользовательскую функцию, подобную этой, и используйте ее в своем запросе
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 ;
надеюсь, это поможет Передать Этот
что-то вроде этого должно работать:
выберите count (*) из таблицы, где fieldname REGEXP '[[:<:>:]]';
кровавые детали находятся в руководстве MySQL, раздел 11.4.2.
что-то вроде LIKE или REGEXP не будет масштабироваться (если это не самый левый префикс).
вместо этого рассмотрите возможность использования fulltext индексируйте за то, что вы хотите сделать.
select count(*) from yourtable where match(title, body) against ('some_word');
Если вам нужен поиск, я бы посоветовал что-то вроде Sphinx или Lucene, я считаю, что Sphinx (как независимый полнотекстовый индексатор) намного проще настроить и запустить. Он работает быстро, и генерирует индексы очень быстро. Даже если бы вы использовали MyISAM, я бы предложил использовать его, он имеет намного больше мощности, чем полнотекстовый индекс от MyISAM.
Он также может интегрировать (несколько) с MySQL.
Это зависит от того, какую СУБД вы используете, некоторые позволяют писать UDFs, которые могли бы это сделать.