LINUX.ORG.RU

Хочу сделать поиск «по вопросу» для FAQ, есть готовые либы?

 ,


1

1

Начитался как Яндекс-Почта улучшила свою поддержку с помощью поиску по FAQ http://habrahabr.ru/company/yandex/blog/245637/

Хочу так же. Да, наверное, все хотят :)

Есть идеи, как это можно реализовать технически?

Вижу проблему в том, что ищется именно вопрос, и нужно применить какой-то умный поиск, с учетом морфологии русско-английского суржика и структуры вопросительных предложений. Может уже есть какие-то готовые либы?

Платформа - сайт на ruby on rails, но варианты с другими языками тоже ок (можно звать внешним способом), если это не какая-нибудь головоломная экзотика с лицензией agpl.

★★★★☆

Последнее исправление: cetjs2 (всего исправлений: 3)

Ответ на: комментарий от nagibator

ну это один из немногих языков, в котором я могу разобраться, и если либа написана на нём это будет даже хорошо, у нас много эрланга

хотя ты прав, надо было создать тему в web-dev, и тогда языки можно было бы не писать

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)

бери Elasticsearch и мозга не канифоль, если нужно встроенное решение - бери Lucene

shty ★★★★★
()

Мне кажется, можно solr прикрутить

GblGbl ★★★★★
()
Ответ на: комментарий от vladimir-vg

fulltext search в Постгресе поищет мне с учетом морфологии?

я хочу поцеловать жабу

я хочу поцеловать жабку

невтерпеж поцеловать жабу

оно поймет, что «я хочу» - это оборот речи и его искать не надо, что «жаба» склоняется по падежам, а «java» не склоняется

и что может быть «жаба» и «java» это вообще одно и то же

поймет строчку «как нафигачить побольше setter'ов?»

что-то подсказывает что нет

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от nagibator

Собственно, все основные варианты уже перечислены.

— Elastic (вроде, самый перспективный, но тяжёлый, сам не щупал)
— Sphinx (использую, легковесный, в качестве морфологии — стемминг)
— Самодельный стемминг (ссылка на библиотеку на PHP по ссылке выше, дальше или переписать на нужный язык, она совсем примитивная, меньше экрана текста, или поискать готовую).
— Самодельная честная морфология (ссылки, плюсы и минусы рассмотрены там же)
— Встроенные средства поиска MySQL и Postres, но они не столь хороши, как я понимаю. Сам использовал только fulltext в MySQL, не понравилось.

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

оно поймет, что «я хочу» - это оборот речи и его искать не надо

Это можно занести в стоп-лист.

что «жаба» склоняется по падежам, а «java» не склоняется

Это да, и стемминг, и честная морфология справятся.

и что может быть «жаба» и «java» это вообще одно и то же

В Sphinx есть вручную заносимые синонимы. Но лучше реализовать свой движок синонимов, будет гибче и мощнее.

KRoN73 ★★★★★
()
Ответ на: комментарий от stevejobs

что-то подсказывает что нет

Да, есть поддержка русской морфологии. Получив query, он нормализируется в ts_query().

оно поймет, что «я хочу» - это оборот речи и его искать не надо, что «жаба» склоняется по падежам, а «java» не склоняется

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

Не думаю что Postgres fulltext search как-то особенно круче Elastic или Sphinx, но зато искаробки, и очень просто работает.


class SetupFulltextSearch < ActiveRecord::Migration
  def up
    execute <<SQL.gsub(/\s+/, ' ').strip
      CREATE INDEX index_items_fulltext_search
      ON items
      USING gin((
        setweight(to_tsvector('russian', coalesce("items"."fields"::json->>'title', '')), 'A') ||
        setweight(to_tsvector('russian', coalesce("items"."fields"::json->>'desc', '')), 'B')
      ))
SQL
  end

  def down
    execute <<SQL.gsub(/\s+/, ' ').strip
      DROP INDEX index_items_fulltext_search
SQL
  end
end

и потом в модели:

  scope :search, (lambda do |query|
    sql_query = <<-SQL.gsub(/\s+/, ' ').strip
      ( setweight(to_tsvector('russian', coalesce("items"."fields"::json->>'title', '')), 'A') ||
        setweight(to_tsvector('russian', coalesce("items"."fields"::json->>'desc', '')), 'B')
      ) @@ plainto_tsquery('russian', ?)
    SQL
    where(sql_query, query)
  end)

и всё, можно комбинировать с другими scope.

vladimir-vg ★★
()
Ответ на: комментарий от vladimir-vg

учитывая, какой я ленивый, скорей всего так и будет xD

но постой, я мог бы спросить это у тебя напрямую, а зачем же весь этот топик на лоре? xDD

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.