1
1
<?php
2
2
3
3
//
4
- // $Id: sphinxapi.php 2055 2009-11-06 23:09:58Z shodan $
4
+ // $Id: sphinxapi.php 2376 2010-06-29 14:08:19Z shodan $
5
5
//
6
6
7
7
//
8
- // Copyright (c) 2001-2008, Andrew Aksyonoff. All rights reserved.
8
+ // Copyright (c) 2001-2010, Andrew Aksyonoff
9
+ // Copyright (c) 2008-2010, Sphinx Technologies Inc
10
+ // All rights reserved
9
11
//
10
12
// This program is free software; you can redistribute it and/or modify
11
13
// it under the terms of the GNU General Public License. You should have
18
20
/////////////////////////////////////////////////////////////////////////////
19
21
20
22
/// known searchd commands
21
- define ( "SEARCHD_COMMAND_SEARCH " , 0 );
22
- define ( "SEARCHD_COMMAND_EXCERPT " , 1 );
23
- define ( "SEARCHD_COMMAND_UPDATE " , 2 );
24
- define ( "SEARCHD_COMMAND_KEYWORDS " ,3 );
25
- define ( "SEARCHD_COMMAND_PERSIST " , 4 );
26
- define ( "SEARCHD_COMMAND_STATUS " , 5 );
27
- define ( "SEARCHD_COMMAND_QUERY " , 6 );
23
+ define ( "SEARCHD_COMMAND_SEARCH " , 0 );
24
+ define ( "SEARCHD_COMMAND_EXCERPT " , 1 );
25
+ define ( "SEARCHD_COMMAND_UPDATE " , 2 );
26
+ define ( "SEARCHD_COMMAND_KEYWORDS " , 3 );
27
+ define ( "SEARCHD_COMMAND_PERSIST " , 4 );
28
+ define ( "SEARCHD_COMMAND_STATUS " , 5 );
29
+ define ( "SEARCHD_COMMAND_QUERY " , 6 );
30
+ define ( "SEARCHD_COMMAND_FLUSHATTRS " , 7 );
28
31
29
32
/// current client-side command implementation versions
30
- define ( "VER_COMMAND_SEARCH " , 0x116 );
31
- define ( "VER_COMMAND_EXCERPT " , 0x100 );
33
+ define ( "VER_COMMAND_SEARCH " , 0x117 );
34
+ define ( "VER_COMMAND_EXCERPT " , 0x102 );
32
35
define ( "VER_COMMAND_UPDATE " , 0x102 );
33
36
define ( "VER_COMMAND_KEYWORDS " , 0x100 );
34
37
define ( "VER_COMMAND_STATUS " , 0x100 );
35
38
define ( "VER_COMMAND_QUERY " , 0x100 );
39
+ define ( "VER_COMMAND_FLUSHATTRS " , 0x100 );
36
40
37
41
/// known searchd status codes
38
42
define ( "SEARCHD_OK " , 0 );
57
61
define ( "SPH_RANK_PROXIMITY " , 4 );
58
62
define ( "SPH_RANK_MATCHANY " , 5 );
59
63
define ( "SPH_RANK_FIELDMASK " , 6 );
64
+ define ( "SPH_RANK_SPH04 " , 7 );
65
+ define ( "SPH_RANK_TOTAL " , 8 );
60
66
61
67
/// known sort modes
62
68
define ( "SPH_SORT_RELEVANCE " , 0 );
78
84
define ( "SPH_ATTR_BOOL " , 4 );
79
85
define ( "SPH_ATTR_FLOAT " , 5 );
80
86
define ( "SPH_ATTR_BIGINT " , 6 );
87
+ define ( "SPH_ATTR_STRING " , 7 );
81
88
define ( "SPH_ATTR_MULTI " , 0x40000000 );
82
89
83
90
/// known grouping functions
@@ -731,11 +738,7 @@ function SetMatchMode ( $mode )
731
738
/// set ranking mode
732
739
function SetRankingMode ( $ ranker )
733
740
{
734
- assert ( $ ranker ==SPH_RANK_PROXIMITY_BM25
735
- || $ ranker ==SPH_RANK_BM25
736
- || $ ranker ==SPH_RANK_NONE
737
- || $ ranker ==SPH_RANK_WORDCOUNT
738
- || $ ranker ==SPH_RANK_PROXIMITY );
741
+ assert ( $ ranker >=0 && $ ranker <SPH_RANK_TOTAL );
739
742
$ this ->_ranker = $ ranker ;
740
743
}
741
744
@@ -1241,6 +1244,10 @@ function _ParseSearchResponse ( $response, $nreqs )
1241
1244
list (,$ val ) = unpack ( "N* " , substr ( $ response , $ p , 4 ) ); $ p += 4 ;
1242
1245
$ attrvals [$ attr ][] = sphFixUint ($ val );
1243
1246
}
1247
+ } else if ( $ type ==SPH_ATTR_STRING )
1248
+ {
1249
+ $ attrvals [$ attr ] = substr ( $ response , $ p , $ val );
1250
+ $ p += $ val ;
1244
1251
} else
1245
1252
{
1246
1253
$ attrvals [$ attr ] = sphFixUint ($ val );
@@ -1305,22 +1312,34 @@ function BuildExcerpts ( $docs, $index, $words, $opts=array() )
1305
1312
if ( !isset ($ opts ["after_match " ]) ) $ opts ["after_match " ] = "</b> " ;
1306
1313
if ( !isset ($ opts ["chunk_separator " ]) ) $ opts ["chunk_separator " ] = " ... " ;
1307
1314
if ( !isset ($ opts ["limit " ]) ) $ opts ["limit " ] = 256 ;
1315
+ if ( !isset ($ opts ["limit_passages " ]) ) $ opts ["limit_passages " ] = 0 ;
1316
+ if ( !isset ($ opts ["limit_words " ]) ) $ opts ["limit_words " ] = 0 ;
1308
1317
if ( !isset ($ opts ["around " ]) ) $ opts ["around " ] = 5 ;
1309
1318
if ( !isset ($ opts ["exact_phrase " ]) ) $ opts ["exact_phrase " ] = false ;
1310
1319
if ( !isset ($ opts ["single_passage " ]) ) $ opts ["single_passage " ] = false ;
1311
1320
if ( !isset ($ opts ["use_boundaries " ]) ) $ opts ["use_boundaries " ] = false ;
1312
1321
if ( !isset ($ opts ["weight_order " ]) ) $ opts ["weight_order " ] = false ;
1322
+ if ( !isset ($ opts ["query_mode " ]) ) $ opts ["query_mode " ] = false ;
1323
+ if ( !isset ($ opts ["force_all_words " ]) ) $ opts ["force_all_words " ] = false ;
1324
+ if ( !isset ($ opts ["start_passage_id " ]) ) $ opts ["start_passage_id " ] = 1 ;
1325
+ if ( !isset ($ opts ["load_files " ]) ) $ opts ["load_files " ] = false ;
1326
+ if ( !isset ($ opts ["html_strip_mode " ]) ) $ opts ["html_strip_mode " ] = "index " ;
1327
+ if ( !isset ($ opts ["allow_empty " ]) ) $ opts ["allow_empty " ] = false ;
1313
1328
1314
1329
/////////////////
1315
1330
// build request
1316
1331
/////////////////
1317
1332
1318
- // v.1.0 req
1333
+ // v.1.2 req
1319
1334
$ flags = 1 ; // remove spaces
1320
1335
if ( $ opts ["exact_phrase " ] ) $ flags |= 2 ;
1321
1336
if ( $ opts ["single_passage " ] ) $ flags |= 4 ;
1322
1337
if ( $ opts ["use_boundaries " ] ) $ flags |= 8 ;
1323
1338
if ( $ opts ["weight_order " ] ) $ flags |= 16 ;
1339
+ if ( $ opts ["query_mode " ] ) $ flags |= 32 ;
1340
+ if ( $ opts ["force_all_words " ] ) $ flags |= 64 ;
1341
+ if ( $ opts ["load_files " ] ) $ flags |= 128 ;
1342
+ if ( $ opts ["allow_empty " ] ) $ flags |= 256 ;
1324
1343
$ req = pack ( "NN " , 0 , $ flags ); // mode=0, flags=$flags
1325
1344
$ req .= pack ( "N " , strlen ($ index ) ) . $ index ; // req index
1326
1345
$ req .= pack ( "N " , strlen ($ words ) ) . $ words ; // req words
@@ -1329,8 +1348,9 @@ function BuildExcerpts ( $docs, $index, $words, $opts=array() )
1329
1348
$ req .= pack ( "N " , strlen ($ opts ["before_match " ]) ) . $ opts ["before_match " ];
1330
1349
$ req .= pack ( "N " , strlen ($ opts ["after_match " ]) ) . $ opts ["after_match " ];
1331
1350
$ req .= pack ( "N " , strlen ($ opts ["chunk_separator " ]) ) . $ opts ["chunk_separator " ];
1332
- $ req .= pack ( "N " , (int )$ opts ["limit " ] );
1333
- $ req .= pack ( "N " , (int )$ opts ["around " ] );
1351
+ $ req .= pack ( "NN " , (int )$ opts ["limit " ], (int )$ opts ["around " ] );
1352
+ $ req .= pack ( "NNN " , (int )$ opts ["limit_passages " ], (int )$ opts ["limit_words " ], (int )$ opts ["start_passage_id " ] ); // v.1.2
1353
+ $ req .= pack ( "N " , strlen ($ opts ["html_strip_mode " ]) ) . $ opts ["html_strip_mode " ];
1334
1354
1335
1355
// documents
1336
1356
$ req .= pack ( "N " , count ($ docs ) );
@@ -1507,6 +1527,7 @@ function UpdateAttributes ( $index, $attrs, $values, $mva=false )
1507
1527
}
1508
1528
1509
1529
// build request
1530
+ $ this ->_MBPush ();
1510
1531
$ req = pack ( "N " , strlen ($ index ) ) . $ index ;
1511
1532
1512
1533
$ req .= pack ( "N " , count ($ attrs ) );
@@ -1531,18 +1552,28 @@ function UpdateAttributes ( $index, $attrs, $values, $mva=false )
1531
1552
1532
1553
// connect, send query, get response
1533
1554
if (!( $ fp = $ this ->_Connect () ))
1555
+ {
1556
+ $ this ->_MBPop ();
1534
1557
return -1 ;
1558
+ }
1535
1559
1536
1560
$ len = strlen ($ req );
1537
1561
$ req = pack ( "nnN " , SEARCHD_COMMAND_UPDATE , VER_COMMAND_UPDATE , $ len ) . $ req ; // add header
1538
1562
if ( !$ this ->_Send ( $ fp , $ req , $ len +8 ) )
1563
+ {
1564
+ $ this ->_MBPop ();
1539
1565
return -1 ;
1566
+ }
1540
1567
1541
1568
if (!( $ response = $ this ->_GetResponse ( $ fp , VER_COMMAND_UPDATE ) ))
1569
+ {
1570
+ $ this ->_MBPop ();
1542
1571
return -1 ;
1572
+ }
1543
1573
1544
1574
// parse response
1545
1575
list (,$ updated ) = unpack ( "N* " , substr ( $ response , 0 , 4 ) );
1576
+ $ this ->_MBPop ();
1546
1577
return $ updated ;
1547
1578
}
1548
1579
@@ -1619,8 +1650,39 @@ function Status ()
1619
1650
$ this ->_MBPop ();
1620
1651
return $ res ;
1621
1652
}
1653
+
1654
+ //////////////////////////////////////////////////////////////////////////
1655
+ // flush
1656
+ //////////////////////////////////////////////////////////////////////////
1657
+
1658
+ function FlushAttributes ()
1659
+ {
1660
+ $ this ->_MBPush ();
1661
+ if (!( $ fp = $ this ->_Connect () ))
1662
+ {
1663
+ $ this ->_MBPop ();
1664
+ return -1 ;
1665
+ }
1666
+
1667
+ $ req = pack ( "nnN " , SEARCHD_COMMAND_FLUSHATTRS , VER_COMMAND_FLUSHATTRS , 0 ); // len=0
1668
+ if ( !( $ this ->_Send ( $ fp , $ req , 8 ) ) ||
1669
+ !( $ response = $ this ->_GetResponse ( $ fp , VER_COMMAND_FLUSHATTRS ) ) )
1670
+ {
1671
+ $ this ->_MBPop ();
1672
+ return -1 ;
1673
+ }
1674
+
1675
+ $ tag = -1 ;
1676
+ if ( strlen ($ response )==4 )
1677
+ list (,$ tag ) = unpack ( "N* " , $ response );
1678
+ else
1679
+ $ this ->_error = "unexpected response length " ;
1680
+
1681
+ $ this ->_MBPop ();
1682
+ return $ tag ;
1683
+ }
1622
1684
}
1623
1685
1624
1686
//
1625
- // $Id: sphinxapi.php 2055 2009-11-06 23:09:58Z shodan $
1687
+ // $Id: sphinxapi.php 2376 2010-06-29 14:08:19Z shodan $
1626
1688
//
0 commit comments