Алгоритм поиска, похожий на Google


Я пытаюсь реализовать алгоритм поиска в своей простой структуре данных. Однако это не вопрос "КАК мне ЭТО СДЕЛАТЬ?", а скорее "как я мог бы оптимизировать алгоритм?"

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

Вот как структурированы мои данные:

Записи:

 ------------------------------------
|  id  | description | short | score | 
 ------------------------------------

Теги:

 -------------
|  id  | text |
 -------------

Теги входа:

 -------------------
| entry_id | tag_id |
 -------------------

В поле поиска, поиск запрос, всегда будет превращен в отдельные слова, разделенные плюсом (+).

В следующем примере я буду искать "синий+веб-сайт+простой+макет"

- split searchterm up into array named t
- convert each word in array t into a number using the id from "Tags" table
- for each element in array t, select make new array for each element with "EntryTags" matching the search
- generate array A, where elements that are in all 4 arrays are put into
- generate array B, where elements that are in 3 of the 4 arrays are put into
- generate array C, where elements that are in 2 of the 4 arrays are put into
- generate array D with the last elemenets rest
- sort array A,B,C and D by the score parameter from the table
- output array A, then B, then C, then D

Конечно, это не оптимизировано или что-то в этом роде, но мое отсутствие опыта работы с более сложным SQL надирает мне задницу:(

В конце концов, все это будет написано на PHP и в библиотеке mysqli (и я, конечно, буду обновлять поток по мере дальнейшего продвижения)

Author: Jan Dragsbaek, 2011-06-04

2 answers

Вы могли бы использовать своего рода Фильтр цветения (по крайней мере, это часть стратегии Google). Сначала вы ищете записи со всеми введенными тегами. Если вы ничего не нашли, попробуйте все комбинации с отсутствием одного тега, а затем с отсутствием двух тегов... пока у вас не будет достаточно спичек. Поиск в фильтре цветения выполняется очень быстро, поэтому можно выполнять много поисков.

 5
Author: Landei, 2011-06-03 21:03:48

Ого, давай не будем усложнять (ПОЦЕЛУЙ), это просто слишком сложно и не гибко.

Как насчет этого: С помощью SQL выполните один поиск для каждого поискового запроса и включите столбец, в котором указывается значение "точка" для конкретной релевантности термина. Суммируйте результаты поиска по этому значению "точки" и найдите результаты, которые имеют наибольшую релевантность, с помощью "точек".

Проверьте это: http://www.jarrodgoddard.com/web-development/advanced-web-site-search-with-sql

SELECT title, filename, sum(relevance)
FROM (
SELECT title, filename, 10 AS relevance FROM page WHERE title like ‘%about%’
UNION
SELECT title, filename, 7 AS relevance FROM page WHERE filename like ‘%about%’
UNION
SELECT title, filename, 5 AS relevance FROM page WHERE keywords like ‘%about%’
UNION
SELECT title, filename, 2 AS relevance FROM page WHERE description like ‘%about%’
) results
GROUP BY title, filename
ORDER BY relevance desc; 
 -1
Author: rlb.usa, 2011-06-03 20:56:13