如何使用Sphinx对数据列进行排序?

时间:2011-11-09 08:10:43

标签: sphinx

我想使用Sphinx对列进行数据排序。例如,我想按列排序数据;假设在product_name字段中找到的数据应首先出现,然后是下一个字段product_description中的数据。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

$cl->setRankingMode(SPH_RANK_WORDCOUNT);
$cl->query("($q) | @product_name ($q)",$index);

是一种方式。

但请尝试

$cl-setFieldWeights(array('product_name'=>10)); 

首先:)

答案 1 :(得分:0)

        #indexer.sh shell script
        #!/bin/bash
        indexer --config /etc/sphinxsearch/sphinx.conf --all --rotate
        #sphinx.conf
        #!/usr/bin/php
        #main root configuration of sphinx file
        #
        source root
        {
            type                = mysql
            sql_host            = localhost
            sql_user            = db_user
            sql_pass            = db_pass
            sql_port            = 3306  # optional, default is 3306
            sql_query_pre       = SET CHARACTER_SET_RESULTS=utf8
            sql_query_pre       = SET NAMES utf8
            sql_query_pre       = SET CHARACTER SET utf8
        }
        #read files from configuration folder to different indexes and sources
        <?php
         //scanfolder and list files to var
         $files = scandir("/etc/sphinxsearch/index_conf/");
         foreach($files as $key => $value)
         {
             if($value != "." && $value != ".." ) 
             {
                    include("index_conf/$value");
             }
         }
        ?>

        #set indexer memory
        indexer
        {
            mem_limit       = 512M
        }
        #set search deamon settings
        searchd
        {
            listen          = 9312
            #listen         = 9306:mysql41
            log             = /var/log/sphinxsearch/searchd.log
            query_log       = /var/log/sphinxsearch/query.log
            read_timeout    = 5
            max_children    = 30
            pid_file        = /var/run/searchd.pid
            max_matches     = 1000000
            seamless_rotate = 1
            preopen_indexes = 0
            unlink_old      = 1
            workers         = threads # for RT to work
            binlog_path     = /var/lib/sphinxsearch/data
        }

        //================= indexer file ==================
        source src_name : root
        {
                #set database selection and query
                sql_db                  = database
                sql_query               = \
                    SELECT  id\
                    'c_a' AS index_id\
                    FROM    table AS t1\
                    LEFT JOIN crimte_table AS t2 ON t1.type = t2.id \
                    WHERE \
                    t1.id <=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1) \
                    GROUP BY t1.id
                    sql_field_string        = index_id
                    sql_attr_uint           = id
                    sql_query_pre           = SET CHARACTER_SET_RESULTS=utf8
                    sql_query_pre           = SET NAMES utf8
                    sql_query_pre           = SET CHARACTER SET utf8
                   sql_query_pre            = REPLACE INTO sph_counter SELECT 1,MAX(id),MAX(updated) FROM table
        }
        #indexing case source
        index src_name
        {
                source          = src_name
                path            = /var/lib/sphinxsearch/data/src_name
                docinfo         = extern
                charset_type    = utf-8
                charset_table = 0..9,U+41..U+5a->U+61..U+7a, U+61..U+7a, U+aa, U+b5, U+ba, \
                U+c0..U+d6->U+e0..U+f6, U+d8..U+de->U+f8..U+fe, U+df..U+f6, U+f8..U+ff, U+100..U+12f/2, \
                U+130->U+69, U+131, U+132..U+137/2, U+138, U+139..U+148/2, U+149, U+14a..U+177/2, \
                U+178->U+ff, U+179..U+17e/2, U+17f..U+180, U+181->U+253, U+182..U+185/2, U+186->U+254, \
                U+187..U+188/2, U+189..U+18a->U+256..U+257, U+18b..U+18c/2, U+18d, U+18e->U+1dd, \
                U+18f->U+259, U+190->U+25b, U+191..U+192/2, U+193->U+260, U+194->U+263, U+195, \
                U+196->U+269, U+197->U+268, U+198..U+199/2, U+19a..U+19b, U+19c->U+26f, U+19d->U+272, \
                U+19e, U+19f->U+275, U+1a0..U+1a5/2, U+1a6->U+280, U+1a7..U+1a8/2, U+1a9->U+283, \
                U+1aa..U+1ab, U+1ac..U+1ad/2, U+1ae->U+288, U+1af..U+1b0/2, U+1b1..U+1b2->U+28a..U+28b, \
                U+1b3..U+1b6/2, U+1b7->U+292, U+1b8..U+1b9/2, U+1ba..U+1bb, U+1bc..U+1bd/2, U+1be..U+1c3, \
                U+1c4->U+1c6, U+1c5..U+1c6/2, U+1c7->U+1c9, U+1c8..U+1c9/2, U+1ca->U+1cc, U+1cb..U+1dc/2, \
                U+1dd, U+1de..U+1ef/2, U+1f0, U+1f1->U+1f3, U+1f2..U+1f5/2, U+1f6->U+195, U+1f7->U+1bf, \
                U+1f8..U+21f/2, U+220->U+19e, U+221, U+222..U+233/2, U+234..U+23a, U+23b..U+23c/2,  \
                U+23d->U+19a, U+23e..U+240, U+241->U+294, U+250..U+2c1, U+2c6..U+2d1, U+2e0..U+2e4, \
                U+2ee, U+37a, U+386..U+389->U+3ac..U+3af, U+38c..U+38e->U+3cc..U+3ce, U+390, \
                U+391..U+3a1->U+3b1..U+3c1, U+3a3..U+3ab->U+3c3..U+3cb, U+3ac..U+3ce, U+3d0..U+3d7, \
                U+3d8..U+3ef/2, U+3f0..U+3f3, U+3f4->U+3b8, U+3f5, U+3f7..U+3f8/2, U+3f9->U+3f2, \
                U+3fa..U+3fb/2, U+3fc..U+3ff, U+400..U+40f->U+450..U+45f, U+410..U+42f->U+430..U+44f, \
                U+430..U+45f, U+460..U+481/2, U+48a..U+4bf/2, U+4c0, U+4c1..U+4ce/2, U+4d0..U+4f9/2, \
                U+500..U+50f/2, U+531..U+556->U+561..U+586, U+559, U+561..U+587, U+5d0..U+5ea, \
                U+5f0..U+5f2, U+621..U+63a, U+640..U+64a, U+66e..U+66f, U+671..U+6d3, U+6d5, \
                U+6e5..U+6e6, U+6ee..U+6ef, U+6fa..U+6fc, U+6ff, U+e01..U+e30, U+e32..U+e33, \
                U+e40..U+e46, U+e81..U+e82, U+e84, U+e87..U+e88, U+e8a, U+e8d, U+e94..U+e97, \
                U+e99..U+e9f, U+ea1..U+ea3, U+ea5, U+ea7, U+eaa..U+eab, U+ead..U+eb0, U+eb2..U+eb3, \
                U+ebd, U+ec0..U+ec4, U+ec6, U+edc..U+edd, U+1000..U+1021, U+1023..U+1027, U+1029..U+102a, \
                U+1050..U+1055, U+10a0..U+10c5->U+2d00..U+2d25, U+10d0..U+10fa, U+10fc, U+2d00..U+2d25, \
                U+1d00..U+1dbf, U+1e00..U+1e95/2, U+1e96..U+1e9b, U+1ea0..U+1ef9/2, U+3005..U+3006, \
                U+3031..U+3035, U+303b..U+303c, U+3041..U+3096, U+309d..U+309f, U+30a1..U+30fa, \
                U+30fc..U+30ff, U+31f0..U+31ff  
        }

        #delta data source and index
        source src_name_delta : root
        {
                #set database selection and query
                sql_db                  = database
                sql_query               = \
                    SELECT id, \
                    'c_a' AS index_id\
                    FROM    table AS t1\
                    LEFT JOIN crimte_table AS t2 ON t1.type = t2.id \
                    WHERE \
                    ( \
                        (t1.id > (SELECT max_doc_id FROM sph_counter WHERE counter_id =10)) \
                        OR (t1.updated > (SELECT updated FROM sph_counter WHERE counter_id=1)) \
                    ) \
                    GROUP BY t1.id
                sql_attr_uint           = id
                sql_field_string        = id
                sql_query_pre           = SET CHARACTER_SET_RESULTS=utf8
                sql_query_pre           = SET NAMES utf8
                sql_query_pre           = SET CHARACTER SET utf8
                #set killlist not exclude from main index
                sql_query_killlist = SELECT id FROM table WHERE \
                            updated > (SELECT updated FROM sph_counter WHERE counter_id=1)
        }

        #indexing case source
        index src_name_delta
        {
                source          = src_name_delta
                path            = /var/lib/sphinxsearch/data/src_name_delta
                docinfo         = extern
                charset_type    = utf-8
                charset_table =..charset table as above
        }
        #indexer.sh
        cat /etc/sphinxsearch/main_indexes.list | xargs indexer --config /etc/sphinxsearch/sphinx.conf --rotate
        #main index (main_indexes.list)
        src_name 
        #delta indexer
        cat /etc/sphinxsearch/delta_indexes.list | xargs indexer --config /etc/sphinxsearch/sphinx.conf --rotate
        #counter table (sph_counter)
        counter_id (int), max_doc_id (int), updated (timestamp)
        #api search
        //set server
        $this->sphinxclient->SetServer('localhost', '9312');
        if($this->input->post("match_type") == 2)
        {
          $this->sphinxclient->SetMatchMode(SPH_MATCH_EXTENDED2);
        }
        else
        {
          $this->sphinxclient->SetMatchMode(SPH_MATCH_ANY);
        }
        $this->sphinxclient->SetRankingMode(SPH_RANK_PROXIMITY_BM25);
        //$this->sphinxclient->SetRankingMode(SPH_RANK_WORDCOUNT);
        $this->sphinxclient->setLimits($starting,$recpage,100000);
        $keyword = $this->input->post("keyword");

        $keyword = trim( html_entity_decode( $keyword, ENT_QUOTES, 'UTF-8') ) ;
        $data['keyword'] = $keyword;   

        $valu = ""; 
        $this->sphinxclient->resetGroupBy();
        //$this->sphinxclient->SetSortMode(SPH_SORT_EXTENDED, "index_id ASC");
        $this->sphinxclient->SetGroupBy("id",SPH_GROUPBY_ATTR);
        $result = $this->sphinxclient->Query($keyword, $indexList);  
        if($result)
        {
           print_r($result);
        }