Поиск на французском через Thinking Sphinx в проекте ROR

Как я могу использовать sphinx для поиска французских слов, записи которых в БД на самом деле английские?

Ситуация такова:

У меня есть проект ROR с таблицей в базе данных под названием «категории», а названия категорий на английском языке, в категории много «вопросов».

В файле локализации config/locals/fr.yml эти категории были переведены на французский язык.

Подумайте о расширяемости, мы не можем изменить имена категорий в базе данных на французский язык.

Пользователь может осуществлять поиск по типу части ключевого слова.

Вот пример: Название категории: Здоровье и медицина На французском языке: Santé et médecine

Итак, как я могу это сделать: введите «Santé médecine abc» в поле поиска, и sphinx вернет «вопросы» в категории «Здоровье и медицина» и будет иметь ключевое слово «abc»?


person Daniel Cheang    schedule 21.03.2010    source источник


Ответы (1)


Во-первых, я думаю, что вы не должны использовать файл yml для перевода данных БД. Вы можете использовать yml для перевода имен столбцов БД, имен моделей и т. д., но не данных, хранящихся в БД. Это плохой дизайн. Лучше всего было бы хранить разные переводы в БД, но вы хотели знать, как сделать такой поиск, не сохраняя его в БД, поэтому:

Вы можете сделать это разными способами. Если вы создаете ссылки на теги (как здесь, на SO), то это очень просто. Вы должны генерировать эти ссылки следующим образом:

# controller
@tags = Tag.all

# view 
<% @tags.each do |tag| %>
  <%= link_to I18n.t tag.name, search_tag_path(tag) %>
<% end %>

Или что-то подобное по вашим моделям и маршрутам.

Если вы хотите иметь несколько флажков или выбрать поля, с помощью которых вы выбираете теги, вы должны сделать это аналогично приведенному выше примеру:

# controller
@tags = Tag.all

# view
<% form_tag search_path do |f| %>
  <% @tags.each do |tag| %>
    <%= I18n.t tag.name %> <%= check_box_tag "tags[#{tag.id}]" %>
  <% end %>
<% end %>

Здесь при отправке вы получите массив идентификаторов выбранных тегов: params[tags].

person klew    schedule 21.03.2010
comment
Спасибо за ответ, категорий много, поэтому составлять список категорий, которые пользователь может выбрать для получения идентификатора категории, нецелесообразно. Клиент хочет ввести часть названия категории в поле поиска, чтобы узнать все вопросы в этой категории, поисковой системой является Sphinx. - person Daniel Cheang; 21.03.2010
comment
Вы имеете в виду, что ввод может быть частью категории на другом языке, тогда он должен получать все вопросы из соответствующих категорий? - person klew; 21.03.2010
comment
Если да, то вам нужно сначала сопоставить все имена категорий из файла yml и получить из него идентификаторы категорий. Затем извлеките все из db. Сфинкс здесь не нужен. Насколько я знаю (знаю совсем немного) о Sphinx, так это то, что он напрямую обращается к db. Так что, вероятно, он может найти только данные, которые находятся в БД. Поэтому, если у вас есть что-то в yml, это не будет использоваться sphinx. Итак, еще раз: вы должны поместить свои переводы в БД. - person klew; 21.03.2010
comment
хорошо, я постараюсь выложить переводы в бд, большое спасибо - person Daniel Cheang; 22.03.2010