2010-01-24 3 views
0

У меня есть a Ruby on Rails site, который использует мышление sphinx для поиска базы данных postgres.Индекс boolean field как строка в sphinx

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

Чтобы полностью объяснить с помощью примера:
Мой сайт предназначен для людей, которые разрабатывают свой собственный черно-белый фильм.
У меня есть таблица рецептов, где люди описывают, как они разрабатывают фильм. В этой таблице есть булевский столбец под названием «stand_developed» (метод разработки фильма).
Я хотел бы возвращать результаты, где это поле верно, когда пользователь ищет слово «стоять».

Я прошел через sphinx docs и не нашел, если это возможно.

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

ответ

0

У меня есть решение для этого сейчас.

Я попробовал «взломать», о котором я упоминал в своем вопросе, - разбор слова «стенд» и поиск его явно (вариант ответа от Пола Дэвиса), но он не очень хорошо работал.

Я не объяснил это в своем вопросе (не понимал, какие последствия в то время, когда я спросил), но мне нужно, чтобы он также соответствовал, если пользователь использовал слово «стойка» в своем описании рецепта.

Итак, я попытался получить сфинкс, чтобы добавить условие по строкам «если stand_developed истинно или заметки содержат« стенд », но я не мог найти правильный синтаксис для этого. Он также имел дело с любым другим текстом поиска.

В конце я добавил дополнительный столбец в таблицу рецептов под названием «search_tags», и я добавлю в него слово «стойка», если пользователь выбирает «stand_developed» при добавлении рецепта. Затем я получаю Sphinx, чтобы индексировать это поле, а также мои другие поля, и все это отлично работает.

1

Это то, что я сделал для поиска в булевых полях с помощью ThinkingSphinx. Pass stand_developed в качестве параметра URL вместе с вашим query_string следующими способами:

  1. URL для общего запроса без поиска по stand_developed будет http://yoursite.com/search?q=your_query_string
  2. URL для запроса с stand_developed == TRUE будет http://yoursite.com/search?q=your_query_string&stand_developed=1
  3. URL для запроса с stand_developed == FALSE будет http://yoursite.com/search?q=your_query_string&stand_developed=0

Затем в контроллере, вы могли бы сделать это:

if params[:stand_developed] && params[:stand_developed].to_i == 1 
    # perform query search with stand_developed == true 
    @search_results = YourModel.search(params[:q], :with => {:stand_developed => true}) 
elsif params[:stand_developed] && params[:stand_developed].to_i == 0 
    # perform query search with stand_developed == false 
    @search_results = YourModel.search(params[:q], :with => {:stand_developed => false}) 
else 
    # perform general query search 
    @search_results = YourModel.search(params[:q]) 
end 
1

Возможно, вы только что протестировали, если params [: search] включили текст «стенд», а затем выполнили поиск оттуда. Вам не нужен дополнительный столбец в вашей таблице, это просто накладные расходы, которые не нужны.

if params[:search].downcase.include?('stand') 
    Model.search params[:search], :with => {:stand_developed => true} 
else 
    Model.search params[:search] 
end 
Смежные вопросы