ФорумПрограммированиеPHP для идиотов → Морфологический поиск

Морфологический поиск

  • 0x4D5Alexander

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 29 июля 2012 г. 20:28

    Кто какие решения использует, почему остановили свой выбор на нем? Интересно ваше мнение на этот счет.
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 29 июля 2012 г. 22:06, спустя 1 час 37 минут 42 секунды

    Sphinx , выбор очевиден.
  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 1:14, спустя 3 часа 8 минут 20 секунд

    elasticsearch
  • 0x4D5Alexander

    Сообщения: 10 Репутация: N Группа: Кто попало

    Spritz 30 июля 2012 г. 3:09, спустя 1 час 55 минут 19 секунд


    elasticsearch

    На сколько мне известно elasticsearch это по-сути Lucene и не умеет морфологический поиск
    Troy прав, вменяемых аналогов сфинксу пока нет. Либо я плохо искал
  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 3:35, спустя 26 минут 4 секунды

    На сколько мне известно elasticsearch это по-сути Lucene и не умеет морфологический поиск

    Для lucene есть плагин для морфологического поиска rus/eng.
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 8:20, спустя 4 часа 44 минуты 56 секунд


    Sphinx , выбор очевиден.

    Не, postgresql + tsearch2 - самый очевидный выбор
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 10:29, спустя 2 часа 8 минут 46 секунд

    mathete, а можешь расписать достоинства?
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 11:18, спустя 49 минут 15 секунд

    Troy, поиск осуществляется самой БД, как любая другая фильтрация. Нет отдельного процесса, с отдельной конфигурацией, с отдельными запросами, индексами и обращениями к нему.

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

    ALTER TABLE blog_article ADD search_tsv TSVECTOR;
    CREATE INDEX search_index ON websites_website USING gist(search_tsv);
    CREATE TRIGGER blog_article_tsvectorupdate BEFORE INSERT OR UPDATE ON blog_article FOR EACH ROW EXECUTE PROCEDURE tsearch2('search_tsv', 'title', 'body', 'tags');


    Вот потом селект:

    SELECT * FROM blog_article WHERE search_tsv @@ to_tsquery('stupid dogs') ;


    Всё. Естественно селекты можешь делать какие угодно с джоинами, кучей других where и ордерить по релевантности.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 июля 2012 г. 11:34, спустя 15 минут 7 секунд

    mathete, ты открыл sphinx mysql plugin :D
    Сапожник без сапог
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 11:39, спустя 5 минут 48 секунд


    mathete, ты открыл sphinx mysql plugin :D

    +1, SphinxSE делает тоже самое
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 июля 2012 г. 11:40, спустя 39 секунд



    mathete, ты открыл sphinx mysql plugin :D

    +1, SphinxSE делает тоже самое
    ага. его и имел ввиду :)
    Сапожник без сапог
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 11:52, спустя 12 минут 20 секунд

    Я ничего не открывал. Я просто показал надежное, эффективное решение.

    Если я ничего не путаю, то тот же Sphinx SE, всё равно не нативное дополнение поверх хранилища, а коннектор к тому же отдельному сфинксовскому процессу.
    То есть это просто такой сахарок.
    А так и имеете отдельный процесс, конфиг и т.д. Да, а чего будет происходить, когда будете джоинить две таблицы - одна Engine sphinxEX, а другая Engine InnoDB, например?

    Теперь понятно, почему нет postgresql-sphinx plugin?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 июля 2012 г. 12:10, спустя 17 минут 23 секунды

    Да, а чего будет происходить, когда будете джоинить две таблицы - одна Engine sphinxEX, а другая Engine InnoDB, например?

    думаю все будет ок. просто создастся In-Memory MyIsam heap table как оыбчно да и все, и она уже будет жойниться. думаешь в постгресе чтто совсем концептуально другое?)
    Сапожник без сапог
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 30 июля 2012 г. 12:27, спустя 17 минут 45 секунд


    думаю все будет ок. просто создастся In-Memory MyIsam heap table как оыбчно да и все, и она уже будет жойниться. думаешь в постгресе чтто совсем концептуально другое?)

    А ну да… Всё очень просто! Я так и вижу планировщик: "У меня миллион записей мне надо сджоиниться с парой таблиц, на каждую построятся In-memory tables, да и ещё законектится по порту 3312 получить айдишники по куску запроса и всё это собрать".
    Я один вижу здесь лютый пиздец? Это не сборище костылей?

    В postgresql конечно же не так. Там поиск ведется по поддерживаему индексу, а поле представлет собой просто отдельный тип данных. Все джоины совершенно нативны, так как разницы в таблицах нет в этом плане.
    Работа с полнотекстовым вектором идет точно также, как датой, например. Это нативный тип данных, к нему есть функции, по нему строится индекс.
    Вообще никакого отличия. Чуть сахарного синтаксиса, ну и индекс не btree, а gist (или gin).
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 июля 2012 г. 12:55, спустя 27 минут 31 секунду

    mathete, спорить и ковыряться лень. побрел домой)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!