Метка «lucene»

Мы живем во времена, когда кажется, что все просто и все есть. Нужно сделать масштабируемый проект — используем MongoDB, нужна очередь — вот RabbitMQ, нужно поднять функционал поиска — раз плюнуть: ставим Sphinx, Solr, ElasticSearch (нужное подчеркнуть).

Но здесь лишь доля правды: — при определенном везении можно поставить нужный сервер и все зашевелится. Загвоздка с поиском состоит в том, что пользователи уже порядком привыкли к высокой планке, которую задают «большие ребята», а тот поиск, что поднимется у вас «из коробки», будет явно недотягивать. И если очередь или базу данных вы можете добить железом прежде, чем будете оптимизировать, то поиск железом не добьешь.

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

Мы посмотрим, как с помощью нашего проекта http://indexisto.com сделан поиск на сайте http://maximonline.ru и сравним его с тем, что есть на других сайтах.

Для начала несколько примеров. Возьмем запрос «Битва за Лос Анджелес» и представим, что его напишут неправильно «Лос Анжелес биттва». Как видно, пользователь не знает точно, как пишется имя города, и забыл, как звучит название фильма, а также у него дрогнула рука в конце на слове «битва».

Выберем достойные проекты рунета, в которых есть префиксный поиск, и попробуем поискать там наш запрос:

Проект Правильный запрос Неправильный запрос
afisha.ru Как это сделано: префиксный поиск
все ОК
Как это сделано: префиксный поиск
Не найдено
ivi.ru Как это сделано: префиксный поиск
все ОК
Как это сделано: префиксный поиск
Не найдено
vk.com Как это сделано: префиксный поиск
все ОК
Как это сделано: префиксный поиск
Не найдено
maximonline.ru Как это сделано: префиксный поиск
все ОК
Как это сделано: префиксный поиск
все ОК

Читать полностью »

image
Некоторое время назад наш поиск стал работать быстрее. Особенно это заметно на сложных для движка запросах, в которых используется минимум фильтров и высокочастотные слова, что требует построить фасеты по результатам и отсортировать максимальные объёмы документов. Но и запросы средней сложности, где в выдаче немного документов, стали обрабатываться заметно быстрее. Почему возникла необходимость что-то ускорять и как мы это делали?
Читать полностью »

Библиотека полнотекстового поиска Lucene предоставляет возможность организовать поиск по текстовым документам. Существуют так же средства, с помощью которых можно организовать поиск «похожих» химических структур, например, OpenBabel. Иногда может возникнуть потребность объединить эти два вида поиска в единой «канве». Например, если нужно создать систему, которая может отвечать на такие запросы: найти вещество, в текстовом описании которого есть слово «аминокислота», структурно похожее на индол (ожидается, что мы найдём аминокислоту триптофан). В этой статье описано решение данной задачи на основе полнотекстового движка Lucene.
Читать полностью »

В моем веб-проекте на Playframework-e в один прекрасный момент потребовался поиск. Идею искать в базе через like я сразу отмел, потому что хотелось ранжирования и прочих плюшек «умного» поиска, а изобретать свой велосипед не было ни времени ни желания.
Так как проект на Java — было очень соблазнительно использовать для этого Lucene.
В гугле я сразу нашел замечательный модуль для Playframework-а под названием Search, также был найден модуль Elastic Search, который тоже использует Lucene, но он требует установки отдельного сервера, и потому был отметен. Модуль Search понравился мне своей простотой — все «навороты» в нем инкапсулированы, так что пользоваться им очень легко.
С установкой модуля, как и всегда в Play-e, проблем не возникло, команда play install search отработала на «ура» и выкачала модуль из репозитория.
Добавив module.search=${play.path}/modules/search-2.0 в application.conf я уже мог использовать его в приложении.
Следуя краткому руководству, я добавил к сущности Entry, по которой собственно и следовало осуществлять поиск, аннотацию @Indexed, а полю description — аннотацию @Field.
Написав в контроллере примерно следующий код:

public static void search(String phrase, int page) {
        int pageSize = PAGE_SIZE;
        Query query = Search.search("description:" + phrase, Entry.class);
        List<Entry> entries = query.page(page*pageSize, pageSize).fetch();
        long totalCount = query.count();
        render(entries, totalCount, page, pageSize, phrase);
}

Я уже был готов делать первые тесты и наращивать функционал, но тут начались проблемы…
Читать полностью »

Вместо вступления

Подкаст вышел с опозданием, поскольку мы ждали, когда мне вернут микрофон. На момент записи его так и не отдали, поэтому меня слышно не очень хорошо, выводы сделали, своих ошибок повторять не будем.
Таинственный образом с хабра пропал «подкаст», поэтому слушайте нас на rpod-е.

Новости

Вышли Rails 3.0.12, 3.1.4, 3.2.2
Товарищ Константин, О времени и о себе. Кстати, упоминаемая в интервью книжица «Sinatra: Up and Running» — тоже очень ничего. Можно рекомендовать как академическое пособие для желающих разобраться, как правильно готовить на Руби web-(и прочее)-middleware и все такое.
Деплой как в Heroku
4 марта вышло обновление на Github, связанное с массовыми уязвимостями на этом сайте
6 марта вышел Vagrant версии 1.0
7 марта вышел Bundler 1.1
Lightrail — легкий rails-стэк для json приложений
Ruby 2.0 Enumerable::Lazy
Except.io — сервис, аналогичный airbrake.io

Обсуждение

Системы полнотекстового поиска

Sphinx — система полнотекстового поиска от Андрея Аксенова
Full Text Search в Postgresql — система полнотекстового поиска, встроенная в Postgresql
Elasticsearch
Solr — сервер полнотекстового поиска от Apache Foundation
Lucene — движок полнотекствого поиска от Apache Foundation

Срывая покровы с Ивана Самсонова

Профиль Ивана на Моем Круге
Профиль Ивана на LinkedIn
Твиттер Ивана
Wheely — компания, где сейчас работает Иван
РГГУ — а здесь Иван сейчас учится

Контакты RubyNoName подкаста

Наш твиттер
Email для предложенией
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js