Индексировать логическое поле как строку в sphinx - PullRequest
0 голосов
/ 24 января 2010

У меня сайт Ruby on Rails , который использует интеллектуальный сфинкс для поиска в базе данных postgres.

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

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

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

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

Ответы [ 3 ]

1 голос
/ 27 октября 2010

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

if params[:search].downcase.include?('stand')
  Model.search params[:search], :with => {:stand_developed => true}
else
  Model.search params[:search]
end
1 голос
/ 31 января 2010

Это то, что я сделал для поиска по логическим полям с помощью ThinkingSphinx. Передайте stand_developed в качестве параметра URL вместе со строкой запроса следующими способами:

  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
0 голосов
/ 05 февраля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...