Google-подобный алгоритм поиска - PullRequest
3 голосов
/ 04 июня 2011

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

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

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

Записи:

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

Теги:

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

EntryTags:

 -------------------
| 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 (и я, конечно, буду обновлять поток по мере продвижения)

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

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

0 голосов
/ 04 июня 2011

Вау, давайте будем простыми (KISS), это слишком сложно и не гибко.

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

Проверьте это: 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; 
...