Создание системы полнотекстового поиска: с чего начать

Я хочу написать веб-приложение, используя Google App Engine (поэтому справочным языком будет Python). Моему приложению нужна простая поисковая машина, чтобы пользователи могли находить данные по ключевым словам.

Например, если у меня есть одна таблица с этими строками:

1 Office space
2 2001: A space odyssey
3 Brazil

и пользовательские запросы для "пробела" будут возвращены строки 1 и 2. Если пользователь запрашивает «офисное пространство», результатом должны быть также строки 1 и 2 (первая строка).

Каковы технические рекомендации / алгоритмы, чтобы сделать это простым способом?
Можете ли вы дать мне хорошие указания на теорию, лежащую в основе этого?

Спасибо.

Редактировать: Я не ищу здесь ничего сложного (скажем, индексации тонны данных).

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
0
7 584
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Я нашел эти две книги очень полезными, когда использовал для создания полнотекстовых поисковых систем.

Поиск информации

Управление гигабайтами

Я не читал и не видел Информационный поиск, но я использовал Управление гигабайтами, и, помимо охвата всего, что необходимо для создания полнотекстовой системы поиска и поиска, она на самом деле очень удобочитаема.

olliej 08.10.2008 06:33

Как всегда старт в википедия. Первым началом обычно является построение перевернутого индекса.

См. Также вопрос, который я задал: Практическое руководство: ранжирование результатов поиска.

Конечно, есть и другие подходы, но сейчас я использую именно этот.

Сначала создайте свой index. Пройдите ввод, разбейте на слова
Для каждого слова проверьте, есть ли оно уже в указателе, если оно добавлено в список указателей, если нет, добавьте слово и номер записи.
Чтобы найти слово, перейдите по (возможно, отсортированному) индексу и верните все номера записей для этого слова. Очень удобно сделать это для списка с изменяемым размером, используя встроенные типы хранения Python.

В качестве дополнительного уточнения вы хотите сохранить только базовую часть слова, например, «найти» вместо «найти» - ищите алгоритмы выделения корней.

Если под «индексом» вы подразумеваете «отображение» или «словарь», то это работа. Если вы это имеете в виду, то уберите слово «отсортированный», поскольку словарь Python представляет собой хэш от ключа к значению.

S.Lott 07.10.2008 04:55

Я имел в виду индекс в общем (книга / БД) смысле. Какой контейнер в питоне лучше всего реализовать - это отдельный вопрос.

Martin Beckett 07.10.2008 05:49

Других вариантов кроме словаря Python нет. Отсюда и предложение, что вы считаете, что нужно отбросить «отсортированный».

S.Lott 07.10.2008 13:51

Честно говоря, люди умнее меня догадались. Я загружал приложение solr и выполнял json-вызовы из моего приложения appengine и позволял solr позаботиться об индексировании.

Вот оригинальная идея:

Не надо построить индекс. Серьезно.

Некоторое время назад я столкнулся с подобной проблемой. Мне нужен был быстрый метод поиска в мегабайтах и ​​мегабайтах текста из документации. Мне нужно было сопоставить не только слова, но и близость слов в больших документах (это слово около это слово). Я просто закончил писать это на C, и скорость этого меня удивила. Он был достаточно быстрым и не нуждался в оптимизации или индексировании.

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

Это привлекает меня, чтобы не переусердствовать. Вверх мод.

Justin Bozonier 07.10.2008 06:37

Прочтите серия сообщений по теме Тима Брея.

  • 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 символов. В любом случае хороший компромисс.

Gabriele D'Antona 11.10.2008 23:07

Я только что нашел эту статью на этих выходных: http://www.perl.com/pub/a/2003/02/19/engine.html

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

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

Lucene или Автономия! Это не стандартные решения для вас. Вам придется писать обертки поверх их интерфейсов. Они определенно позаботятся об основах, грамматике, реляционных операторах и т. д.

Книга Введение в поиск информации дает хорошее введение в эту область.

Версия мертвого дерева опубликована 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

Он просто перебирает все элементы, чтобы увидеть, находится ли запрос в каком-либо из них. Он работает для простой функции поиска в приложении. Хотя, возможно, не для всего Интернета.

Другие вопросы по теме