PHP - 如何在带RT索引的狮身人面像中配置通配符和模糊搜索




我正在尝试调查狮身人面像 rt 索引以在未来的项目中使用,并对它们有一些疑问。

  1. 有没有办法在狮身人面像 rt 索引中进行通配符搜索?
  2. 如何使用 php 的狮身人面像客户端 API 查询 rt 索引?

我发现的唯一方法是将mysql_connect()mysql_query()与狮身人面像QL一起使用。

我在狮身人面像搜索论坛上问了这个问题,并收到了这样的回复:

你好。

Barryhunter刚刚回复了"RT索引通配符搜索":

===

切割===

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?

是的,狮身人面像API可以查询RT索引(它只是无法更新它们)

但是由于 RT 索引不索引前缀/中缀(通配符搜索需要),因此它不会给您带来任何好处。现在我相信,一切都可以用 sphinx API 来完成 sphinxQL)

===

切割===

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

停止、配置、重新索引和启动狮身人面像为了让狮身人面像接收我们需要停止、配置、重新索引和启动狮身人面像的更改。思考狮身人面像有一些耙子任务可以让你做到这一点:

    RAILS_ENV=xxx
    rake ts:stop
    rake ts:conf
    rake ts:in
    rake ts:start

验证狮身人面像配置现在在编辑器中打开狮身人面像配置文件:

    $ 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 查询 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 的 Sphinx 搜索使用 Sphinx 搜索进行地理空间搜索的完整示例代码

最新更新