1.) Чтобы настроить подстановочный и нечеткий поиск в вашей модели, сначала установите свойства enable_star и min_infix_len внутри блока define_index:
class Post...
define_index do
...
set_property :enable_star => true
set_property :min_infix_len => 1
end
При желании вы можете сделать настройки глобальными, добавив их в config / sphinx.yml:
production:
enable_star: true
min_infix_len: 1
Остановите, настройте, переиндексируйте и запустите Sphinx
Чтобы Sphinx мог получить изменения, нам нужно остановить, настроить, переиндексировать и запустить Sphinx.
Thinking Sphinx имеет несколько рейковых заданий, которые позволяют вам сделать это:
RAILS_ENV=xxx
rake ts:stop
rake ts:conf
rake ts:in
rake ts:start
Проверка конфигурации Sphinx
Теперь откройте файл конфигурации Sphinx в редакторе:
$ vim config/production.sphinx.conf
Убедитесь, что вы видите правильные настройки:
...
index post_core
{
...
min_infix_len = 1
enable_star = true
}
...
Запустите консоль и выполните несколько запросов:
Post.search('xxx', :star => true)
Теперь осталось создать контроллер поиска и посмотреть:
class SearchController...
def index
@query = params[:query]
options = {
:page => params[:page], :per_page => params[:per_page], :star => true,
:field_weights => { :title => 20, :tags => 10, :body => 5 }
}
@posts = Post.search(@query, options)
end
Примечание. Чтобы получить релевантные результаты поиска, необходимо назначить разным весам поля.
И, наконец, вот интерфейсный php для публикации результатов поиска в коде представления:
<% @posts.each do |post| %>
content goes here...
<% end %>
2.) Вот пример запроса индекса rt с помощью API клиента sphinx для php:
include('include/sphinxapi.php');
$_longitude = '42.358431';
$_latitude = '-71.059773';
$search = new SphinxClient();
$search->SetServer('[SERVER IP REMOVED]', 9312);
$search->SetConnectTimeout(1);
$search->SetArrayResult(true);
$search->SetMatchMode(SPH_MATCH_ALL);
$search->SetGeoAnchor('venue_latitude', 'venue_longitude', (float)deg2rad($_latitude), (float)deg2rad($_longitude));
$search->SetSelect('*');
$search->SetLimits(0, 100);
$result = $search->Query('b', 'rt_deals');
# results, print_r($result):
Array
(
[error] =>
[warning] =>
[status] => 0
[fields] => Array
(
[0] => deal_types
)
[attrs] => Array
(
[venue_id] => 1
[venue_latitude] => 5
[venue_longitude] => 5
[dt_start] => 2
[dt_end] => 2
[@geodist] => 5
)
[matches] => Array
(
[0] => Array
(
[id] => 45
[weight] => 1
[attrs] => Array
(
[venue_id] => 42
[venue_latitude] => 0.73878991603851
[venue_longitude] => -1.2425578832626
[dt_start] => 0
[dt_end] => 0
[@geodist] => 15278498
)
)
[1] => Array
(
[id] => 46
[weight] => 1
[attrs] => Array
(
[venue_id] => 41
[venue_latitude] => 0.73908978700638
[venue_longitude] => -1.2415384054184
[dt_start] => 0
[dt_end] => 0
[@geodist] => 15278115
)
)
)
[total] => 2
[total_found] => 2
[time] => 0.000
[words] => Array
(
[b] => Array
(
[docs] => 2
[hits] => 2
)
)
)
Для получения дополнительной информации, вы можете проверить полный пример кода GeoSpatial Search с использованием Sphinx Search w / Php от God-Object.com