PHP - 如何在Sphinx w / RT索引中配置通配符和模糊搜索

时间:2011-05-13 15:19:28

标签: php mysql sphinx


我正在尝试调查sphinx rt索引以便在将来的项目中使用,并对它们有一些疑问。

  1. 有没有办法在sphinx rt索引中进行通配符搜索?
  2. 如何使用sphinx client api for php查询rt索引?
  3. 我找到的唯一方法是使用sphinxQL mysql_connect()mysql_query()

2 个答案:

答案 0 :(得分:1)

我在sphinxsearch论坛上问了这个问题并收到了这个回复:

您好。

barryhunter刚回复'RT index wildcard search':

===切===

1.Is there any way to make wildcard search in sphinx rt indexes?

我不相信 - 尚未实施。检查错误跟踪器,如果没有将其添加为功能请求。

2.How can I query rt index with sphinx client api for php?

是的,Sphinx API可以查询RT索引(它只是无法更新它们)

(但是因为RT索引没有索引前缀/中缀(通配符搜索所需)它不会给你带来任何好处。一切都可以用sphinx API完成,现在我可以用sphinxQL来完成)

===切===

答案 1 :(得分:0)

1.。)要在模型中配置通配符和模糊搜索,首先在define_index块中设置enable_star和min_infix_len属性:

    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的更改。 思考Sphinx有一些rake任务可以让你这样做:

    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。)这是一个用sphinx客户端api为php查询rt索引的例子:

    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
                            )
            )
    )

有关详情,请查看God-Object.com的GeoSpatial Search Using Sphinx Search w/ Php的完整示例代码