Количество вхождений слова в строку в MySQL

Я делаю функцию поиска для своего веб-сайта, которая находит соответствующие результаты из базы данных. Я ищу способ подсчета вхождений слова, но мне нужно убедиться, что есть границы слов с обеих сторон слова ( поэтому я не заканчиваю "тройным", когда хочу "разорвать").

У кого-нибудь есть идеи?


люди неправильно поняли мой вопрос:

Как я могу подсчитать количество таких вхождений в одном грести?

9 ответов


Это не та вещь, в которой реляционные базы данных очень хороши, если вы не можете использовать полнотекстовое индексирование, и вы уже заявили, что не можете, так как вы используете InnoDB. Я бы предложил выбрать соответствующие строки и выполнить подсчет слов в коде приложения.


вы можете попробовать этот извращенный способ:

SELECT 
(LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
ORDER BY `count` DESC
  • этот запрос может быть очень медленным
  • это выглядит довольно некрасиво
  • REPLACE () чувствителен к регистру

вы можете преодолеть проблему 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 ;

надеюсь, это поможет Передать Этот


что-то вроде этого должно работать:

выберите count (*) из таблицы, где fieldname REGEXP '[[:<:>:]]';

кровавые детали находятся в руководстве MySQL, раздел 11.4.2.


что-то вроде LIKE или REGEXP не будет масштабироваться (если это не самый левый префикс).

вместо этого рассмотрите возможность использования fulltext индексируйте за то, что вы хотите сделать.

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

я использовал технику, как описано в ссылке ниже. Метод использует length и replace функции MySQL.

Релевантность Ключевых Слов


Если вам нужен поиск, я бы посоветовал что-то вроде Sphinx или Lucene, я считаю, что Sphinx (как независимый полнотекстовый индексатор) намного проще настроить и запустить. Он работает быстро, и генерирует индексы очень быстро. Даже если бы вы использовали MyISAM, я бы предложил использовать его, он имеет намного больше мощности, чем полнотекстовый индекс от MyISAM.

Он также может интегрировать (несколько) с MySQL.


Это зависит от того, какую СУБД вы используете, некоторые позволяют писать UDFs, которые могли бы это сделать.