SphinxSE檢索語法

SphinxSE檢索語法

要通過SphinxSE搜索,您需要建立特殊的ENGINE=SPHINX的“搜索表”,然後使用SELECT語句從中檢索,把全文查詢放在WHERE子句中。

CREATE TABLE t1
(
    id          INTEGER UNSIGNED NOT NULL,
    weight      INTEGER NOT NULL,
    query       VARCHAR(3072) NOT NULL,
    group_id    INTEGER,
    INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test";

SELECT * FROM t1 WHERE query='test it;mode=any';

搜索表前三列(字段)的類型必須是INTEGER UNSINGED(或者 BIGINT),INTEGER(或者 BIGINT)和VARCHAR(或者 TEXT),這三列分別對應文檔ID,匹配權值和搜索查詢。這前三個列的映射關係是固定的,你不能忽略這三列中的任何一個,或者移動其位置,或者改變其類型。搜索查詢列必須被索引,其他列必須無索引。列的名字會被忽略,所以可以任意命名。

除此之外,其他列(字段)的類型必須是INTEGER、TIMESTAMP、BIGINT、VARCHAR或者FLOAT之一。它們必須與Sphinx結果集中提供的屬性按名稱綁定,即它們的名字必須與sphinx.conf中指定的屬性名(sql_field_string)一一對應。如果Sphinx搜索結果中沒有某個屬性名,該列的值就爲NULL.

特殊的“虛擬”屬性名也可以與SphinxSE列綁定。但特殊符號@用_sph_代替。例如,要取得@group和@count虛屬性,列名應使用_sph_group和_sph_count。

可以使用字符串參數CONNECTION來指定用這個表搜索時的默認搜索主機、端口號和索引。如果CREATE TABLE中沒有使用連接(connection)串,那麼默認使用索引名“*”(搜索所有索引)和localhost:9312。連接串的語法如下:

CONNECTION=“sphinx:HOST:PORT/INDEXNAME”
默認的連接串也可以後面改變:
ALTER TABLE t1 CONNECTION=“sphinx:
NEWHOST:NEWPORT/NEWINDEXNAME”; 
也可以在查詢中覆蓋 

如例子所示,查詢文本和搜索選項都應放在WHERE子句中對query列的限制中(即第三列),選項之間用分號分隔,選項名與選項值用等號隔開。可以指定任意數目的選項。可用的選項如下:

基本語法

query – 查詢文本;
mode – 匹配模式.必須是 “all”, “any”, “phrase”, “boolean”, 或者 “extended” 之一。默認爲 “all”;
sort – 匹配項排序模式 必須是 “relevance”, “attr_desc”, “attr_asc”, “time_segments”, 或者 “extended” 之一。除了“relevance”模式,其他模式中還必須在一個冒號後附上屬性名(或“extended”模式中的排序子句):
... WHERE query='test;sort=attr_asc:group_id';
... WHERE query='test;sort=extended:@weight desc, group_id asc';
offset – 結果集中的偏移量,默認是0;
limit – 從結果集中獲取的匹配項數目,默認爲20;
index – 待搜索的索引:
... WHERE query='test;index=test1;';
... WHERE query='test;index=test1,test2,test3;';
minid, maxid – 匹配文檔ID的最小值和最大值;
weights – 逗號分隔的列表,指定Sphinx全文數據字段的權值:
... WHERE query='test;weights=1,2,3;';
filter, !filter – 逗號分隔的列表,指定一個屬性名和一系列可匹配的屬性值:
# only include groups 1, 5 and 19
... WHERE query='test;filter=group_id,1,5,19;';

# exclude groups 3 and 11
... WHERE query='test;!filter=group_id,3,11;';
range, !range – 逗號分隔的列表,指定一個屬性名和該屬性可匹配的最小值和最大值:
# include groups from 3 to 7, inclusive
... WHERE query='test;range=group_id,3,7;';

# exclude groups from 5 to 25
... WHERE query='test;!range=group_id,5,25;';
maxmatches – 此查詢最大匹配的數量:
... WHERE query='test;maxmatches=2000;';
groupby – 分組(group-by)函數和屬性:
... WHERE query='test;groupby=day:published_ts;';
... WHERE query='test;groupby=attr:group_id;';
groupsort – 分組(group-by)排序子句:
... WHERE query='test;groupsort=@count desc;';
indexweights – 逗號分隔的列表,指定一系列索引名和搜索時這些索引對應的權值:
... WHERE query='test;indexweights=idx_exact,2,idx_stemmed,1;';
非常重要的注意事項:讓Sphinx來對結果集執行排序、過濾和切片(slice)要比提高最大匹配項數量然後在MySQL端用WHERE、ORDER BY和LIMIT子句完成對應的功能來得高效得多。這有兩方面的原因。首先,Sphinx對這些操作做了一些優化,比MySQL效率更高一些。其次,searchd可以打包更少的數據,SphinxSE也可以傳輸和解包更少的數據。但目前並不適合itdida,因爲我們還有狀態菜單及左側分組

從版本0.9.9-rc1開始,除了結果集,額外的查詢信息可以用SHOW ENGINE SPHINX STATUS語句獲得: 
mysql> SHOW ENGINE SPHINX STATUS;
+--------+-------+-------------------------------------------------+
| Type   | Name  | Status                                          |
+--------+-------+-------------------------------------------------+
| SPHINX | stats | total: 25, total found: 25, time: 126, words: 2 | 
| SPHINX | words | sphinx:591:1256 soft:11076:15945                | 
+--------+-------+-------------------------------------------------+
2 rows in set (0.00 sec)
查詢狀態信息可以通過狀態變量名來訪問。值得提醒的是,訪問這些信息不需要超級用戶權限。

mysql> SHOW STATUS LIKE 'sphinx_%';
+--------------------+----------------------------------+
| Variable_name      | Value                            |
+--------------------+----------------------------------+
| sphinx_total       | 25                               | 
| sphinx_total_found | 25                               | 
| sphinx_time        | 126                              | 
| sphinx_word_count  | 2                                | 
| sphinx_words       | sphinx:591:1256 soft:11076:15945 | 
+--------------------+----------------------------------+
5 rows in set (0.00 sec)
可以對SphinxSE搜索表和其他引擎的表之間使用JOIN,以下是一個例子,例中“documents”來自example.sql:

mysql> SELECT content, date_added FROM test.documents docs
-> JOIN t1 ON (docs.id=t1.id) 
-> WHERE query="one document;mode=any";
+-------------------------------------+---------------------+
| content                             | docdate             |
+-------------------------------------+---------------------+
| this is my test document number two | 2006-06-17 14:04:28 | 
| this is my test document number one | 2006-06-17 14:04:28 | 
+-------------------------------------+---------------------+
2 rows in set (0.00 sec)

mysql> SHOW ENGINE SPHINX STATUS;
+--------+-------+---------------------------------------------+
| Type   | Name  | Status                                      |
+--------+-------+---------------------------------------------+
| SPHINX | stats | total: 2, total found: 2, time: 0, words: 2 | 
| SPHINX | words | one:1:2 document:2:2                        | 
+--------+-------+---------------------------------------------+
2 rows in set (0.00 sec)

示例代碼

CREATE TABLE `sph_index` (
  `id` bigint(20) unsigned NOT NULL,
  `weight` int(11) NOT NULL,
  `query` varchar(1024) NOT NULL,
  `group_id` int(11) DEFAULT NULL COMMENT '查詢語名',
  `uuid` varchar(32) DEFAULT NULL COMMENT '返回Entity的uuid',
  KEY `query` (`query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8

select sph.*, yd.* from sph_index sph
left join tbl yd on uuid = tbl.id
where query='@* "20",@str_field1 -"日本";filter=int_field,12,11;range=timestamp_field,1418371200,1481529600;range=int_field,10,20; index=sph_yd;mode=extended;limit=40;sort=extended:crated_time desc';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章