欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

sphinx笔记

shiping1 的头像

sphinx笔记

require ( "sphinxapi.php" );

$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_EXTENDED2);
$cl->SetSortMode ( SPH_SORT_ATTR_DESC,'title');
//$cl->SetFilter('group_id',array(1),false);
//$cl->SetFilter('deleted',array(0),false);
//$cl->UpdateAttributes ( "mysql", array("group_id"), array(4=>array(1)) );
//$cl->UpdateAttributes ( "mysql", array("deleted"), array(4=>array(1)) );
$res = $cl->Query ( '@title 张三丰', "delta" );

1.SetMatchMode 匹配模式

SPH_MATCH_ALL, 匹配所有查询词(默认模式);

SPH_MATCH_ANY, 匹配查询词中的任意一个;

SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配;

SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式 (参见 Section 4.2, “布尔查询语法”);

SPH_MATCH_EXTENDED, 将查询看作一个Sphinx/Coreseek内部查询语言的表达式 (参见 Section 4.3, “扩展查询语法”). 从版本Coreseek 3/Sphinx 0.9.9开始, 这个选项被选项SPH_MATCH_EXTENDED2代替,它提供了更多功能和更佳的性能。保留这个选项是为了与遗留的旧代码兼容——这样即使Sphinx及其组件包括API升级的时候,旧的应用程序代码还能够继续工作。

SPH_MATCH_EXTENDED2, 使用第二版的“扩展匹配模式”对查询进行匹配.SPH_MATCH_FULLSCAN, 强制使用下文所述的“完整扫描”模式来对查询进行匹配。注意,在此模式下,所有的查询词都被忽略,尽管过滤器、过滤器范围以及分组仍然起作用,但任何文本匹配都不会发生.

这里说一下SPH_MATCH_EXTENDED与SPH_MATCH_EXTENDED2 这的意思就是指可以对检索字段用sphinx扩展表达式去过滤数据

这里注意如果某个字段设置了属性,则不会索引,如:

sql_query        = \
        SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, title as s_title, content \
        FROM documents

    sql_attr_uint        = group_id
    sql_attr_timestamp    = date_added
    sql_field_string = title
    sql_attr_string = s_title
    sql_attr_string = content

这里content设置了属性,所以SPH_MATCH_EXTENDED2下查询@content时会报错query error: no field 'content' found in schema ,这在1.10版本里给解决了,用sql_field_string(sql_field_string = title # will be both indexed and stored)既可以索引也可以保存,这时查询@title的话就不会报错

sphinx扩展表达式如下:

在扩展查询模式中可以使用如下特殊操作符:

 或(OR)操作符: hello | world

 非(NOT)操作符:hello -worldhello !world

 字段(field)搜索符: @title hello @body world ---查找title索引字段包含hello的和body索引字段包含world的,即title=hello and body=world

如为 @title hello | world 表示包含hello 或 world

如为 @title hello world   表示既包含hello又包含world的

 字段限位修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入): @body[50] hello

 多字段搜索符: @(title,body) hello world ---查找title body索引字段含有hello和world的,即title=xxx or body=xxx

 全字段搜索符: @* hello  ---查找所有索引的字段包含hello的

 词组搜索符: "hello world"

 近似搜索符: "hello world"~10

 阀值匹配符: "the world is a wonderful place"/3

 严格有序搜索符(即“在前”搜索符): aaa << bbb << ccc

 严格形式修饰符(版本Coreseek 3/Sphinx 0.9.9-rc1中引入): raining =cats and =dogs

 字段开始和字段结束修饰符 (版本Coreseek 3.1/Sphinx 0.9.9-rc2中引入): ^hello world$

2.SetSortMode 排序模式

SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面) ---这里设置属性的都可以按照SPH_SORT_ATTR_ASC/DESC来排序,如$cl->SetSortMode ( SPH_SORT_ATTR_DESC,'title');

SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)

SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序

SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排列。 ---这里特别说明下现在还是不支持string类型的排序的,如果这样设置的话$cl->SetSortMode ( SPH_SORT_EXTENDED,'title'); 运行时报错sort-by on string attribute 'title' not (yet) supported 这时换种思路就是上面的SPH_SORT_ATTR_ASC/DESC来排序

SPH_SORT_EXPR 模式,按某个算术表达式排序。

3.SetFilter增加整数值过滤器

$cl->SetFilter('group_id',array(1),false); 第三个布尔型参数意思是:true表示如果匹配的到了也拒绝,false表示匹配到了接收;所以当为true时,即使group_id有为1的情况,也是拒绝的,不予显示

这里过滤的只是整数型属性。如为string类型的还是@title这种方式。它也算是一种补充吧

4.UpdateAttributes 修改属性值

原型: function UpdateAttributes ( $index, $attrs, $values )

立即更新指定文档的指定属性值。成功则返回实际被更新的文档数目(0或更多),失败则返回-1。

如:$cl->UpdateAttributes ( "mysql", array("deleted"), array(4=>array(1)) );这多用在删除的时候或修改的时候,这里设置的deleted字段在合并索引时可以删除掉设置为1的文档(无用的文档)

5.合并索引

合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还是比重新索引少)

基本的命令语法如下:

indexer --merge DSTINDEX SRCINDEX [--rotate]

SRCINDEX的内容被合并到DSTINDEX中,因此只有DSTINDEX索引会被改变。若DSTINDEX已经被searchd于提供服务,则--rotate参数是必须的。最初设计的使用模式是,将小量的更新从SRCINDEX合并到DSTINDEX中。因此,当属性被合并时,一旦出现了重复的文档ID,SRCINDEX中的属性值更优先(会覆盖DSTINDEX中的值)。不过要注意,“旧的”关键字在这个过程中并会被自动删除。例如,在DSTINDEX中有一个叫做“old”的关键字与文档123相关联,而在SRCINDEX中则有关键字“new”与同一个文档相关,那么在合并后用这两个关键字能找到文档123。您可以给出一个显式条件来将文档从DSTINDEX中移除,以便应对这种情况,相关的开关是--merge-dst-range:

indexer --merge main delta --merge-dst-range deleted 0 0

如:indexer.exe -c ..\etc\csft_mysql.conf --merge mysql delta --merge-dst-range deleted 0 0 --rotate

这个开关允许您在合并过程中对目标索引实施过滤。过滤器可以有多个,只有满足全部过滤条件的文档才会在最终合并后的索引中出现。在上述例子中,过滤器只允许“deleted”为0的那些条件通过,而去除所有标记为已删除(“deleted”)的记录(可以通过调用UpdateAttributes()设置文档的属性)。

参考:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html

 

来自 http://hi.baidu.com/life_to_you/item/0976c70e5442bfe2f55ba63c

 

普通分类: