Как искать, сколько раз ключевые слова будут появляться в нескольких текстах между двумя таблицами - PullRequest
0 голосов
/ 27 мая 2019

У меня есть 2 таблицы, и они имеют следующие столбцы.

articles: id (PK), article (longtext), date (date)

keywords: id (PK), keyword (varchar)

На данный момент я могу только это сделать, выполнить поиск по жесткому ключевому слову и отобразить текст, в котором слово встречается чаще всего:

SELECT * , MATCH (article) AGAINST ("keyword*" IN BOOLEAN MODE) AS relevance 
FROM `articles` 
WHERE MATCH (article) AGAINST ("keyword*" IN BOOLEAN MODE) ORDER BY relevance DESC LIMIT 10

Как я могу искать, сколько раз каждое ключевое слово (Таблица: ключевые слова) появляется в каждом тексте (Таблица: статьи)?

Я пробовал это (я не знаю, возможно ли это?), Но я получаю «Неверный аргумент ПРОТИВ»:

SELECT keyword
FROM keywords
CROSS JOIN articles
WHERE MATCH (keywords.keyword)
        AGAINST (articles.article IN NATURAL LANGUAGE MODE)

РЕДАКТИРОВАТЬ ДЛЯ Гордона Линоффа:

Table : Keywords

Id     Keyword

1      first     
2      second   
3      text
4      keyword  

-

Table : Articles

Id     Article

1      the first text     
2      the second text   
3      text text text

Желаемые результаты:

Keyword     score

text        5
first       1
second      1
keyword     0

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Хранение ключевых слов в разделенных строках - это просто неправильный способ их хранения. У вас должна быть соединительная / связанная таблица с одной строкой на ключевое слово в каждой статье.

Тем не менее, иногда мы застряли с очень, очень, очень плохими моделями данных других людей. Если это ваша модель данных, вы должны потратить исправление it вместо , используя it.

Но вы можете сделать это с помощью некоторых манипуляций со строками:

select kw.motcle,
       sum( (length(d.articles) -
             length(replace(d.articles, mc.motcle, '')
            ) / length(d.articles)
          ) as cnt
from test_motcle mc left join
     articles a
     on fin_in_set(mc.motcle, replace(d.articles, ' ', ',') > 0
group by mc.motcle
order by cnt desc;
0 голосов
/ 27 мая 2019
select kw.motcle, count(d.articles)
from test_motcle kw left join
     articles d
     on concat(' ', d.articles, ' ') like concat('% ', kw.motcle, ' %')
group by kw.motcle
ORDER BY count(d.articles) DESC
LIMIT 10

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...