MySQL 5.6 Полнотекстовый поиск против ElasticSearch для моего веб-приложения ASP.NET 4.5
Я строю веб-приложение в ASP.NET 4.5 C#. Мое приложение будет в значительной степени опираться на возможности поиска. Я ищу высокопроизводительное поисковое решение для моего проекта. Я смотрю на тот, который эффективен / быстр и прост в реализации.
Обдумав несколько решений, я обнаружил, что ElasticSearch предлагает отличные возможности поиска, а также он поддерживается Amazon Web Services, если я решу развернуть там свой проект.
Однако я читал, что MySQL 5.6 теперь поддерживает полнотекстовый поиск по таблицам InnoDB. Я хотел знать разницу, минусы и плюсы каждого подхода, чтобы решить, какой из них использовать в моем следующем проекте.
Моя главная цель: возможность очень быстрого поиска по моей базе данных и использование преимуществ поиска на естественном языке, оценки и т. Д. У меня будут очень маленькие текстовые поля по 100 символов для моих текстовых полей с возможностью поиска.
Резюме моих вопросов:
- Каковы фундаментальные различия между полнотекстовым поиском MySQL 5.6 и ElasticSearch? (преимущества и недостатки)
- С полнотекстовым поиском MySQL мне нужно отделить поисковый индекс / функциональность от базы данных (например, с ElasticSearch я использую сервер ELasticSearch, который я могу развернуть на другом сервере. Интересно, работает ли он так же с MySQL Full Текстовый поиск тоже?
- Какой из них легче реализовать?
- Есть ли какие-либо преимущества использования в проекте ASP.NET (например, поддерживаемые клиентские библиотеки и т. Д.)
Благодарю.
1 ответ
Я не очень хорошо знаком с возможностями полнотекстового поиска MySQL 5.6, но я использую ElasticSearch в своем веб-приложении ASP.NET.
MySQL запрашивается в SQL, ES запрашивается в JSON, так как это RESTful
В то время как MySQL является самой системой управления базами данных, ElasticSearch - это только поисковая система. Данные, по которым выполняется поиск, хранятся в его индексе (хранилище данных ElasticSearch называется индексом). Этот индекс иногда терпит неудачу, и тогда вам нужно сделать резервную копию ваших данных в некоторой внешней базе данных (я использую решение NoSQL - MongoDB, так как я борюсь с проблемой BigData), из которой вы восстанавливаете его.
ElasticSearch является распределенной системой. Он использует шарды - когда вы выполняете поиск, индекс разделяется на количество шардов, которые ищутся независимо отдельными потоками. Затем результаты поиска объединяются в один набор. Поскольку оценка рассчитывается некоторым образом на основе количества записей, по которым выполняется поиск, она может отличаться для одной и той же записи в зависимости от того, какой это был фрагмент и сколько записей было назначено этому фрагменту (хотя это настраивается в параметрах поисковых запросов. - см. DFSThenFetch)
С ES можно взаимодействовать из кода C# с помощью библиотеки NEST, которая позволяет отображать сущности ES в классы C# и запрашивать их по LINQ с помощью лямбда-синтаксиса (используя выражения больше, чем предикаты)
Запрашивать ElasticSearch может быть довольно сложно, если у ваших сущностей много полей. В моем случае мне пришлось реализовать довольно сложный построитель запросов, так как существует очень много способов выполнения поискового запроса на ElasticSearch - см. http://www.elasticsearch.org/guide/reference/query-dsl/ (все эти типы запросов реализованы в библиотеке NEST). Вы запрашиваете совсем другое соответствие для строки, чем фильтрация данных, например. Больше или меньше.
ES позволяет вам использовать нечеткое сопоставление, основанное на расстоянии Левенштейна, что довольно хорошо при борьбе с опечатками.
ElasticSearch очень, очень быстрый. Когда MS SQL Server искал мои данные (простым запросом) более 1 минуты, ES делает это менее чем за 20 мс (даже используя очень сложный запрос). Это распределенная реализация поисковой системы Lucene.
Я знаю, что мой пост не является прямым ответом на ваши вопросы, но я надеюсь, что он предоставит вам некоторую информацию относительно ElasticSearch и поможет вам в любом случае. Приветствия.