首页 > 开发 > 综合 > 正文

SphinxSE检索语法

2024-07-21 02:52:00
字体:
来源:转载
供稿:网友

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=utf8select sph.*, yd.* from sph_index sphleft join tbl yd on uuid = tbl.idwhere 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';
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表