lucene使用与优化

发表时间:2011-08-03 02:41:10 文章分类:sphinx 阅读:3499
1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。1.2 lucene能做什么要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉 你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据 库表的若干个字段索引起来,那就不用再担心因为“%like%”而锁表了;你也可以写个自己的搜索引擎……1.3 你该不该选择lucene下面给出一些测试数据,如果你觉得可以接受,那么可以选择。测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。测试二:37000记录,索引数据库中的两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5ms。2 lucene的工作方式lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。2.1写入流程源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。将源中需要的信息加入Document的各个Field中,并把

漫话中文分词算法

发表时间:2011-03-13 05:16:12 文章分类:sphinx 阅读:3381
记得第一次了解中文分词算法是在Google 黑板报上看到的,当初看到那个算法时我彻底被震撼住了,想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法。最近在詹卫东老师的《中文信息处理导论》课上再次学到中文分词算法,才知道这并不是中文分词算法研究的全部,前前后后还有很多故事可讲。在没有建立统计语言模型时,人们还在语言学的角度对自动分词进行研究,期间诞生了很多有意思的理论。    中文分词的主要困难在于分词歧义。“结婚的和尚未结婚的”,应该分成“结婚/的/和/尚未/结婚/的”,还是“结婚/的/和尚/未/结婚/的”?人来判断很容易,要交给计算机来处理就麻烦了。问题的关键就是,“和尚未”里的“和尚”也是一个词, “尚未”也是一个词,从计算机的角度看上去,两者似乎都有可能。对于计算机来说,这样的分词困境就叫做“交集型歧义”。    有时候,交集型歧义的“歧义链”有可能会更长。“中外科学名著”里,“中外”、“外科”、“科学”、“学名”、“名著”全是词,光从词库的角度来看,随便切几刀下去,得出的切分都是合理的。类似的例子数不胜数,“提高产品质量”、“鞭炮声响彻夜空”、“努力学习语法规则”等句子都有这样的现象。在这些极端例子下,分词算法谁优谁劣可谓是一试便知。    最简单的,也是最容易想到的自动分词算法,便是“最大匹配法”了。也就是说,从句子左端开始,不断匹配最长的词(组不了词的单字则单独划开),直到把句子划分完。算法的理由很简单:人在阅读时也是从左往右逐字读入的,最大匹配法是与人的习惯相符的。而在大多数情况下,这种算法也的确能侥幸成功。不过,这种算法并不可靠,构造反例可以不费吹灰之力。例如,“北京大学生前来应聘”本应是“北京/大学生/前来/应聘”,却会被误分成“北京大学/生前/来/应聘”。    维护一个特殊规

Sphinx在windows下如何安装使用

发表时间:2010-07-31 02:16:51 文章分类:sphinx 阅读:24638
一、关于SphinxSphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系作者(Sphinxsearch.com)以获得商业授权。一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索API非常简单,可以在若干个小时之内移植到新的语言上。Sphinx特性:* 高速的建立索引(在当代CPU上,峰值性能可达到10MB/秒);* 高性能的搜索(在2–4GB的文本数据上,平均每次检索响应时间小于0.1秒);* 可处理海量数据(目前已知可以处理超过100GB的文本数据,在单一CPU的系统上可处理100M文档);* 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;* 支持分布式搜索;*提供文件的摘录生成;*可作为MySQL的存储引擎提供搜索服务;*支持布尔、短语、词语相似度等多种检索模式;*文档支持多个全文检索字段(最大不超过32个);*文档支持多个额外的属性信息(例如:分组信息,时间戳等);*停止词查询;*支持单一字节编码和UTF-8编码;*原生的MySQL支

sphinx对特殊词库(.net,C#等)的处理方法

发表时间:2010-03-11 03:55:20 文章分类:sphinx 阅读:137698
在搜索引擎中,需要处理C++时,如果分词器中没有词组C++,则将被切分为C/x +/x +/x,在进一步的检索中,可能每个词会由于出现的过于频繁而被过滤掉,导致搜索的结果与C++相关度不高不说,也严重影响的全文搜索的速度。在LibMMSeg中,内置对特殊短语的支持。[separator]其输入文件格式如下// test commit.net => dotnetc# => csharpc++ => cplusplus其中左侧是待支持的特殊短语,右侧是左侧的特殊短语需要被转换为的短语。这一转换在分词前进行。可以在行的开头加入'//'作为注释符号,发现符号'//'后,整行将被忽略。特殊短语词库构造命令:mmseg -b bestlovesky.txt其中, 开关'-b'指示mmseg是要构造特殊短语词库;exceptions.txt是用户编辑的特殊短语转换规则。该命令执行后,将在当前目录下产生一个名为"synonyms.dat"的文件,将该文件放在"uni.lib"同一目录下,分词系统将自动启动特殊短语转换功能。注意:1、在启用了该功能后,如果分词系统发现了一个特殊短语,将直接输出其在右侧对应的替换的值;2、右侧被替换的值,请保证不会被分词器进行切分。(eg. C++ =>

sphinx数据文件简析

发表时间:2010-01-16 06:27:45 文章分类:sphinx 阅读:228366
Sphinx使用的文件包括“sph”,“spa”,“spi”,“spd”, “spp”,“spm”,还有锁文件(.spl)。其中sph是系统的配置文件。其它则为索引文件。lSpi文件:保存WordId及指向此WordId对应的文档信息在spd文件的指针。Spi文件在检索程序启动时完全加载入内存。Spi文件是分块的,块内排序,块之间也排序。分块的目的应该是为了快速检索到WordId,因为Spi中的WordId是变长压缩的,索引需要先在块级别做二分定位,再在快内解压缩查找。文件结构,每块中结构,wordId实际存储的是差值WordIdSpdFilePointerDocNumHitNum2Spd文件:文件结构DocID[DocInfo]

Sphinx速成指南

发表时间:2010-01-16 05:53:39 文章分类:sphinx 阅读:100204
1. Sphinx简介1.1. 什么是全文检索全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。1.2. 介绍Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。1.3. Sphinx的特性[separator]高速索引 (在新款CPU上,近10 MB/秒);高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);高可用性 (单CPU上最大可支持100 GB的文本,100M文档);提供良好的相关性排名支持分布式搜索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索supports boolean, phrase, and word proximity queries;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码;supports English stemming, Russian stemming, and Soundex for morphology;支持MySQ(MyISAM和InnoDB 表都支持);支持PostgreSQL. 2. Sphinx安装(For MySQL)2.1. Windows下安装从http://dev.mysql.co

Sphinx速成指南--sphinx.conf配置文件

发表时间:2010-01-16 05:49:21 文章分类:sphinx 阅读:68076
#type 数据库类型,目前支持mysql与pgsql#strip_html 是否去掉html标签#sql_host 数据库主机地址#sql_user 数据库用户名#sql_pass 数据库密码#sql_db 数据库名称#sql_port 数据库采用的端口#sql_query_pre 执行sql前要设置的字符集,用utf8必须SET NAMES utf8#sql_query 全文检索要显示的内容,在这里尽可能不使用where或group by,将where与groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高# 注意:select 出来的字段必须至少包括一个唯一主键(ARTICLESID)以及要全文检索的字段,你计划原本在where中要用到的字段也要select出来# 这里不用使用orderby#sql_attr_开头的表示一些属性字段,你原计划要用在where,orderby,groupby中的字段要在这里定义#根据我们原先的SQL:#select * from eht_articles where title like ? and catalogid=? And edituserid=? And addtime between ? and ? order by hits desc#我们需要对catalogid,edituserid,addtime,hits进行属性定义(这四个字段也要在select的字段列表中),定义时不同的字段类型有不同的属性名称,具体可以见sphinx.conf.in中的说明[separator]source cgfinal{type= mysqlstrip_html= 0in

Sphinx搜索语法

发表时间:2010-01-16 05:47:27 文章分类:sphinx 阅读:298544
1.匹配模式有如下可选的匹配模式:SPH_MATCH_ALL, 匹配所有查询词(默认模式)SPH_MATCH_ANY, 匹配查询词中的任意一个SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式SPH_MATCH_EXTENDED, 将查询看作一个Sphinx内部查询语言的表达式[separator]还有一个特殊的“完整扫描”模式,当如下条件满足时,该模式被自动激活:1. 查询串是空的(即长度为零)2. docinfo 存储方式为extern在完整扫描模式中,全部已索引的文档都被看作是匹配的。这类匹配仍然会被过滤、排序或分组,但是并不会做任何真正的全文检索。这种模式可以用来统一全文检索和非全文检索的代码,或者减轻SQL服务器的负担(有些时候Sphinx扫描的速度要优于类似的MySQL查询)2. 布尔查询布尔查询允许使用下列特殊操作符: 显式的与(AND)操作符hello & world 或(OR)操作符hello | world 非(NOT)操作符hello -worldhello !world 分组(grouping)( hello world )以下是一个使用了如上全部操作符的例子:布尔查询示例( cat -dog ) | ( cat -mouse)与(AND)操作符为默认操作,所以“hell

用sphinx实现BestLoveSky! 中文全文检索

发表时间:2010-01-16 05:45:10 文章分类:sphinx 阅读:108854
在mysql和sphinx安装配置完成后,我们就可以来进行bestlovesky 中文全文检索的实现。首先以下是配置文件:[separator]source Bbestloveskysrc{        type                                    = mysql        sql_host                                = localhost        sql_user                                = root        sql_pass                                = passwod        sql_db                                  = database        sql_query_pre=  SET NAMES utf8        sql_query                               =                 SELECT id, title, introtext,unix_timestamp(created) as addtime                 FROM jos_content        sql_attr_timestamp              = addtime        sql_ranged_throttle     = 0}index bestloveskyinx{        source                  = bestloveskysrc        path              

如何给Sphinx做增量索引更新

发表时间:2010-01-16 05:27:02 文章分类:sphinx 阅读:208353
在利用 Sphinx 做搜索引擎的时候,一般他的索引建立构成有如下几个部分:1. 固定不变的主索引2. 增量索引重建3. 索引数据合并[separator]在实际操作中,需要需要为增量索引的建立创建辅助表,这样才可以记住最后建立索引的记录ID,做实际的增量部分的索引建立。CREATE TABLE search_counter(   counterid INTEGER PRIMARY KEY NOT NULL,   max_doc_id INTEGER NOT NULL);在主索引的数据源中作如下方式的取数据设置    sql_query_pre            = SET NAMES utf8    sql_query_pre            = SET SESSION query_cache_type=OFF    sql_query_pre            = REPLACE INTO search_counter         SELECT 1,MA

BuildExcerpts,UpdateAttributes

发表时间:2010-01-16 04:47:19 文章分类:sphinx 阅读:542713
原型: function BuildExcerpts ( $docs, $index, $words, $opts=array() )BuildExcerpts用来产生文档片段.搜索后拿到记录的id,再重新取数据得出二维数组,然后再把每一条记录中的某字段内容拿出来再做成数组,这个数组就是$docs,然后使用BuildExcerpts方法得到高亮后的数组,再重新放回到原来的二维数组中。$index只要写一个索引就行了。原型: function UpdateAttributes ( $index, $attrs, $values )立即更新指定文档的指属性值。可以说,增量索引是为增量记录存在,这个方法则是为修改和删除考虑的。修改跟删除,其实是一样的,不过从细处说又不太一样。先说修改,写一个方法,只传入记录的id,然后从数据库取出记录,用此方法更新配置文件中所有的属性。这个其实很简单,不过删除时碰到了点儿问题。后来在配置文件sql_query的sql语句加一个字段,比如原来是select id, title, content from table,改成select id, title, content,1 as delfrom table。这样只要在程序里多加一个过滤字段就可以了,删除时,只更新此字段,$s->UpdateAttributes('post_main, post_delta', array('del'), array($id => array(0)));就可以了。

Sphinx的API查询接口-实例说明

发表时间:2010-01-16 04:44:10 文章分类:sphinx 阅读:103205
//创建Sphinx的客户端接口对象  $cl = new SphinxClient ();  //设置连接Sphinx主机名与端口  $cl->SetServer('localhost',3312);[separator]  //可选,为每一个全文检索字段设置权重,主要根据你在sql_query中定义的字段的顺序,Sphinx系统以后会调整,可以按字段名称来设定权重  $cl->SetWeights ( array ( 100, 1 ) );  //设定搜索模式,SPH_MATCH_ALL,SPH_MATCH_ANY,SPH_MATCH_BOOLEAN,SPH_MATCH_EXTENDED,SPH_MATCH_PHRASE  $cl->SetMatchMode(SPH_MATCH_ALL);  //设定过滤条件$attribute是属性名,相当于字段名(用SPH_MATCH_EXTENDED时),$value是值,$exclude是布尔型,  当为true时,相当于$attribute!=$value,默认值是false  $cl->SetFilter($attribute, $values, $exclude);  //设定group by  //根据分组方法,匹配的记录集被分流到不同的组,每个组都记录着组的匹配记录数以及根据当前排序方法本组中的最佳匹配记录。  //最后的结果集包含各组的一个最佳匹配记录,和匹配数量以及分组函数值  //结果集分组可以采用任意一个排序语句,包括文档的属性以及s

无论$query 是多长,buildkeywords之后就只剩前10个词了

发表时间:2010-01-16 04:22:06 文章分类:sphinx 阅读:54396
csft::src/sphinx.h搜索:#define SPH_MAX_QUERY_WORDS 10默认为10个,根据需要适当修改。但是过多的搜索词汇,会导致性能降低。该设置,仅影响查询和buildkeywords,对索引无任何影响。

sphinx UpdateAttributes删除指定索引记录

发表时间:2010-01-16 04:20:48 文章分类:sphinx 阅读:133594
可以在创建索引时,配置文件中设置以下属性:sql_attr_bool =delis_deleted 默认值为 0 ,当记录要删除时,调用接口中的 UpdateAttributes设置其属性值为 1,在搜索和合并索引时增加过滤器只让 is_deleted 为 0 的记录通过 select id, title, content,1 as delfrom table $s->UpdateAttributes('post_main, post_delta', array('del'), array($id => array(0)));  在合并索引的时候怎么设置过程器?相关的开关是--merge-dst-range:indexer --merge main delta --merge-dst-range is_deleted 0 0这个开关允许您在合并过程中对目标索引实施过滤。过滤器可以有多个,只有满足全部过滤条件的文档才会在最终合并后的索引中出现。在此例子中,过滤器只允许“is_deleted”为 0 的那些条件通过,而去除所有标记为已删除(“is_deleted” 为非0)的记录

如何提高建立索引的速度

发表时间:2010-01-16 04:19:39 文章分类:sphinx 阅读:96759
1. 在索引阶段,你可以仔细观察,是哪一步操作时间较长? 这一部可以判断,你是否需要提升或者优化你的sql服务器,获得更好的查询性能。 是否你的查询过于复杂,或者设置的属性过多。2. mem_limit = 256M(需要根据你的服务器实际情况配置) 可以适当设置该值,一般。太低的值会影响索引速度,但256M到1024M对绝大多数数据集(如果不是全部)来说应该足够了。这个值设得太高可能导致SQL服务器连接超时。3. max_iops = 0(需要根据你的服务器实际情况配置)indexer在索引时可能导致突发的密集磁盘I/O,因此需要限制它磁盘活动(给同一台机器上运行的其他程序留出一些资源,比如searchd)。I/O节流就是用来实现上述功能的。它的工作原理是,在indexer的连续磁盘I/O操作之间强制增加一个保证的延迟。现代SATA硬盘每秒钟可以执行多达70-100以上次的I/O操作(主要受磁头寻道时间的限制)。将索引I/O限制为上述数值的几分之一可以减轻由索引带来的搜索性能下降。4. max_iosize = 1048576(需要根据你的服务器实际情况配置)与I/O节流有关的选项。它限制indexer文件I/O操作的单次最大大小。值0代表不加限制。超过限制的读写操作会被分成几个小的操作,并被max_iops 计为多次。在本文写作时,全部I/O操作都被限制在256KB以下(默认的内部缓冲大小),因此大于256KB的max_iosize值没有任何作用。5. 另外,在实际应用中,我们还适当采用增量索引的方式,仅对最新的数据进行更新,从而获得更好的更新速度。
12下一页