Я хочу написать веб-приложение, используя Google App Engine (поэтому справочным языком будет Python). Моему приложению нужна простая поисковая машина, чтобы пользователи могли находить данные по ключевым словам.
Например, если у меня есть одна таблица с этими строками:
1 Office space
2 2001: A space odyssey
3 Brazil
и пользовательские запросы для "пробела" будут возвращены строки 1 и 2. Если пользователь запрашивает «офисное пространство», результатом должны быть также строки 1 и 2 (первая строка).
Каковы технические рекомендации / алгоритмы, чтобы сделать это простым способом?
Можете ли вы дать мне хорошие указания на теорию, лежащую в основе этого?
Спасибо.
Редактировать: Я не ищу здесь ничего сложного (скажем, индексации тонны данных).






Я нашел эти две книги очень полезными, когда использовал для создания полнотекстовых поисковых систем.
Как всегда старт в википедия. Первым началом обычно является построение перевернутого индекса.
См. Также вопрос, который я задал: Практическое руководство: ранжирование результатов поиска.
Конечно, есть и другие подходы, но сейчас я использую именно этот.
Сначала создайте свой index.
Пройдите ввод, разбейте на слова
Для каждого слова проверьте, есть ли оно уже в указателе, если оно добавлено в список указателей, если нет, добавьте слово и номер записи.
Чтобы найти слово, перейдите по (возможно, отсортированному) индексу и верните все номера записей для этого слова.
Очень удобно сделать это для списка с изменяемым размером, используя встроенные типы хранения Python.
В качестве дополнительного уточнения вы хотите сохранить только базовую часть слова, например, «найти» вместо «найти» - ищите алгоритмы выделения корней.
Если под «индексом» вы подразумеваете «отображение» или «словарь», то это работа. Если вы это имеете в виду, то уберите слово «отсортированный», поскольку словарь Python представляет собой хэш от ключа к значению.
Я имел в виду индекс в общем (книга / БД) смысле. Какой контейнер в питоне лучше всего реализовать - это отдельный вопрос.
Других вариантов кроме словаря Python нет. Отсюда и предложение, что вы считаете, что нужно отбросить «отсортированный».
Честно говоря, люди умнее меня догадались. Я загружал приложение solr и выполнял json-вызовы из моего приложения appengine и позволял solr позаботиться об индексировании.
Вот оригинальная идея:
Не надо построить индекс. Серьезно.
Некоторое время назад я столкнулся с подобной проблемой. Мне нужен был быстрый метод поиска в мегабайтах и мегабайтах текста из документации. Мне нужно было сопоставить не только слова, но и близость слов в больших документах (это слово около это слово). Я просто закончил писать это на C, и скорость этого меня удивила. Он был достаточно быстрым и не нуждался в оптимизации или индексировании.
Со скоростью современных компьютеров, если вы пишете код, который работает прямо на металле (скомпилированный код), вам часто не нужен алгоритм типа журнала заказов (n), чтобы получить необходимую производительность.
Это привлекает меня, чтобы не переусердствовать. Вверх мод.
Прочтите серия сообщений по теме Тима Брея.
- Background
- Usage of search engines
- Basics
- Precision and recall
- Search engne intelligence
- Tricky search terms
- Stopwords
- Metadata
- Internationalization
- Ranking results
- XML
- Robots
- Requirements list
Сам бы я не строил, если можно.
App Engine включает в себя основы механизма полнотекстового поиска, и есть отличный пост в блоге здесь, в котором описано, как его использовать.
Существует также запрос функции в системе отслеживания ошибок, который, кажется, привлекает к себе некоторое внимание в последнее время, так что вы можете подождать, если сможете, пока это не будет реализовано.
Я пробовал, работает, даже если есть глюки; например, похоже, что он не поддерживает запросы короче 3 символов. В любом случае хороший компромисс.
Я только что нашел эту статью на этих выходных: http://www.perl.com/pub/a/2003/02/19/engine.html
Выглядит не слишком сложно, чтобы сделать простой (хотя для решения корпоративного типа потребуется серьезная оптимизация). Я планирую попробовать проверить концепцию с некоторыми данными из Project Gutenberg.
Если вы просто ищете что-то, что можно изучить и чему научиться, я думаю, это хорошее начало.
Книга Введение в поиск информации дает хорошее введение в эту область.
Версия мертвого дерева опубликована Cambridge University Press, но вы также можете найти бесплатную онлайн-версию (в HTML и PDF) по ссылке выше.
Загляните в книгу «Управление гигабайтами», в которой рассказывается о хранении и извлечении огромных объемов текстовых данных, например. как сжатие, так и фактический поиск, а также множество алгоритмов, которые можно использовать для каждого из них.
Кроме того, для поиска в виде обычного текста вам лучше использовать систему поиска на основе векторов, а не систему индексации ключевых слов-> документов, поскольку системы на основе векторов могут быть намного быстрее и, что более важно, могут относительно легко обеспечить ранжирование по релевантности.
Попробуй это: Скажем, таблица переменных - это ваш список поисковых записей.
query = input("Query: ").strip().lower()#Or raw_input, for python 2
end = []
for item in table:
if query in item.strip().lower():
end.append(item)
print end #Narrowed results
Он просто перебирает все элементы, чтобы увидеть, находится ли запрос в каком-либо из них. Он работает для простой функции поиска в приложении. Хотя, возможно, не для всего Интернета.
Я не читал и не видел Информационный поиск, но я использовал Управление гигабайтами, и, помимо охвата всего, что необходимо для создания полнотекстовой системы поиска и поиска, она на самом деле очень удобочитаема.