Эффективный запрос из таблицы индекса - PullRequest
1 голос
/ 08 марта 2019

У меня есть таблица MySQL, в которой индексируются тысячи записей следующим образом

enter image description here

Первый столбец содержит ключевое слово, второй - количество вхожденийи в 3-м столбце есть массив, в котором каждый индекс содержит массив длины 3, так что 1-й индекс представляет идентификатор сообщения, 2-й номер вхождения в этом сообщении и 3-й индекс содержит массив номеров строк, в которыхключевое слово найдено.

Теперь я хочу создать поисковую систему, где пользователи смогут искать посты по ключевым словам.Самым простым решением было бы получить все результаты для каждого ключевого слова из запроса MySQL и затем найти все общие идентификаторы сообщений с помощью javascript (как я использую Node).

Я знаю, что должны быть способы сделатьэто эффективно.Я думаю об использовании MongoDB, но я не уверен, будет ли это работать.А также я не могу использовать упругий поиск.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Для нормализации вам, вероятно, понадобятся как минимум две таблицы.

Один для простого удержания ключевых слов (и легко и быстро ссылающегося значения keyword_id).

Вторая таблица для "index", hold (ключевое слово_id, post_id, номер_строки). Наличие полей, содержащих счетчики, становится немного избыточным, когда простые запросы «счетчика» в этой индексной таблице могут давать те же результаты без необходимости синхронизации со строковыми данными.

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

SELECT i.post_id, COUNT(DISTINCT i.keyword_id) AS keywordsUsed 
FROM keywords AS k
INNER JOIN keywords_index AS i ON k.keyword_id = i.keyword_id
WHERE k.keyword IN ( 'your', 'list', 'of', 'keywords')
GROUP BY i.post_id
ORDER BY keywordsUsed DESC
;

или это

SELECT post_id, COUNT(DISTINCT keyword_id) AS keywordsUsed 
FROM keywords_index 
WHERE keyword_id IN (
   SELECT keyword_id 
   FROM keywords 
   WHERE keyword IN ( 'your', 'list', 'of', 'keywords')
)
GROUP BY post_id
ORDER BY keywordsUsed DESC
;

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

Строка [[113, 1, [822]], [199, 1, [11592]],[267, 1, [5293 - это минимум 50 байтов (при условии однобайтового набора символов), без учета спецификатора длины для самой строки. Даже удаление значений счетчика и связанных с ним запятых и пробелов только уменьшает данные на 9 байт.

113, 822 199, 11592 267, 5293 24 байта, при условии, что INT используется для значений идентификатора.

0 голосов
/ 08 марта 2019

Запрос на выборку должен выглядеть примерно так:

Select {third column name} from {table name} where {first column name} like %?%

, поэтому, если вы передадите agree, вы должны получить [[2,1,[673], [7,3,[303, 2863, 2866],[9,2,[...]]

Это должно вернуть вашмассив, который вы должны иметь возможность map() сверх

, если вы хотите первый индекс ...

{array}.map((subArray) => subArray[0]); //returns an array of the first index

, это вернет [2,7,9]

Если выпытаясь получить третий индекс и объединить их, вы должны быть в состоянии foreach() и concat()

let sample = [];
{array}.forEach((subArray) => { sample = sample.concat(subArray);});

Это вернет `[673, 303, 2863, 2866, ...]

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