Skip to content


25 个在 Web 中嵌入图表的免费资源[转]

 

在 Web 中嵌入图形图表的技术越来越丰富,我们可以选择 JavaScript 库,CSS,Flash,Silverlight,PHP 库,服务器端的组件,也可以选择 Google Chart API 这样的 Web 服务。本文介绍了25个在 Web 中嵌入图形图表的免费资源。

JS Charts (基于 JavaScript 的图表生成工具)

js-charts

Protovis (可视化 javaScript 图表生成工具)

chart4

Visifire (基于 Silverlight 和 WPF 的开源图表组件)

chart6

pChart (PHP图表类库框架)

pchart

Ejschart (Javascript)

chartx

XML/SWF Charts

chart3

Chronoscope (开源)

timeline

Open Flash Chart 2

chart7

FusionCharts Free

top5

JFreeChart (flash)

jfr

Flare (Flash ActionScript 库)

flare

Google Chart API

google

Google Chart Generator

chart_01

Timeplot (基于 DHTML 的 AJAX 饰件)

timeplot

CSS Chart Generator (基于 CSS 的即时 Web 图表生成)

viper

YUI Library

chart9

PlotKit (JavaScript 图表库)

chart10

Flotr (基于 Prototype框架的图表类库)

flotr

Rapha?l (JavaScript library)

chart11

Protochart (开源类库,基于 Prototype 和 Canvas)

points

Bluff (Rubby 下的 Gruff 图表类库的 JavaScript 移植)

bluff

Pure Css Line Graph (纯粹基于 CSS 的线形图)

chart12

Pure Css Data Chart

css3

CSS Stacked Bar Graphs

stacked

Illustrator tutorial

illustrator

本文资料来源:http://blogof.francescomugnai.com/2009/04/25-great-free-resources-for-making-charts/
编译:COMSHARP CMS 官方网站

Posted in 其它, 网站建设.

Tagged with , .


数据之美(三)[转]

片图抵千言,任何数据报告都不如一幅图来得形象,6月中旬,我们曾译介了 Webdesigner Depot 的一篇文章,《数据之美》()。本文是 Webdesigner Depot 推出的另一篇同题材文章,介绍了25幅令人赞叹的计算机数据图形(Infographics),再次领略数据之美。

1. Web 趋势图


2. 字体周期表


3. 全球 Internet 流量图


4. 经验的归结


5. Flickr 用户模型


6. 浏览器之战


7. 垃圾信息阅读报告


8. 网络文章的生命周期


9. 在线沟通地图


10. 用 1001 个 Web2.0 标志组成的世界地图


11. 全球海底光缆地图


12. SEO毒药

13. Google PageRank 之视觉解释

14. 用社会媒体开一间公司

15. SEO 清单

16. 博客文章的生命周期


17. 软件战势图


18. 美国网民结构图


19. 看看1600万色的模样


20. 可视化表示方式周期表


21. Internet 周期表


22. 国家编码地图

23. 苹果产品分布图


24. 美国 50年来消费电子市场与价格分布


25. Yahoo 所有 API 与服务分布图


26. 数字存储媒介的重量与尺寸


27. 同国家不同时期对色彩的喜好


28. Facebook vs. Twitter

本文国际来源:http://www.webdesignerdepot.com/2009/06/25-useful-infographics-for-web-designers/
中文翻译来源:COMSHARP CMS 官方网站

Posted in 其它, 分析报告.

Tagged with .


数据之美(下)[转]

数据是抽象的,尤其是海量数据,人的大脑很难直接对大量数据进行分析并获得印象,然而从另一个角度看,数据也可以异常美丽,人们设计了很多工具,让枯燥的数据图形化,本文介绍了50个数据图形化工具,它们以令人难以置信的方式让我们看到了数据美丽的一面。这是本文档第二部分,第一部分请参阅数据之美(上)。

其它

Visualizing Information Flow in Science

显示学术刊物被引用的关系,借此评价一份学术刊物的份量。

 

Micro Fashion Network: Color

该图显示了时装风格的持续变化,尤其是基本的色彩元素。使用一架固定相机加专业软件拍摄并分析剑桥大学里面人们的服装颜色。

 

TED Sphere

将 TED 大会的视频以 3D 形式展示在一个球体上,你可以从内部或外部观看这个球体,视频的摆放基于语义关联。

 

Visualizing The Bible

圣经中63000个相互引用的行文关系,纯粹为了显示一种漂亮效果。

 

Walrus

在一个 3D 界面中通巨量图形进行交互。选择一个节点,让图形以该点位中心放大。

 

We Feel Fine

这是一个很有趣的数据可视化工具,显示某一天博客圈的总体情绪,你可以根据年龄,地点,性别,天气等进行筛选,该图反映了互联网当前的情绪。

 

One Week of The Guardian

展示了英国 Guardian 报一周来所有文章的关系,标题,作者,页数以及目录。

 

Nemulator

一个心理模拟项目。

 

Voyage

一个基于 Web 的 RSS 阅读器,在时间轴上可视化显示你的 RSS 订阅。

 

Blooming Numbers

该项目旨在研究不同文化背景下人们对不同数字的偏好。

 

CIA World Factbook Visualization

根据 CIA 数据,显示不同国家之间的关系,包括邻国,语言,水源以及疆界等。

 

TextArc Visualization of The History of Science

《科学史》一书的结构图。

 

Newspaper Map

没看明白,原文链接已经失效 – 译者。

 

GraphNews

Libero WebNews 推出的新闻可视化浏览器。

 

Newsmap

显示 Google News 当前新闻标题,显示不同新闻之间在不同文化下的关系。

 

FreeMind

一个基于 Java 的工具,可以让用户快速建立数据可视化应用,生成的数据地图可以输出到 XHTML 格式的文件。

 

Resource System Reference Database

曾作为 IEEE 2004 年会 InfoVis2004 的海报,该图中,曲线的粗细代表关系的强弱。

 

Is the New

大量某某某是新的某某某一类的句式,如“紫色是一种新式粉红”,“技术是一种新式宗教”。

 

WikiMindMap

以结构地图的形式显示 Wiki 内容。

 

How Scientific Paradigms Relate

显示了大约700个科学范例之间的关系,以及他们是如何被超过80万篇科学论文所涉及。

 

Universe

某个搜索条目的复杂而海量的可视化结果。

 

visualcomplexity.com

众多数据库可视化图标的总汇,包括商业,艺术,互联网,知识网络,生物,交通,社会等。

 

The Strengths of Nations

10个不同国家的科学水平可视化展示,包括美国,英国,法国,中国,澳大利亚等,分23个不同领域,包括数学,生物学,天文学等。

本文国际来源:http://www.webdesignerdepot.com/2009/06/50-great-examples-of-data-visualization/
中文翻译来源:COMSHARP CMS 官方网站

Posted in 其它, 分析报告.

Tagged with .


数据之美(上)[转]

数据是抽象的,尤其是海量数据,人的大脑很难直接对大量数据进行分析并获得印象,然而从另一个角度看,数据也可以异常美丽,人们设计了很多工具,让枯燥的数据图形化,本文介绍了50个数据图形化工具,它们以令人难以置信的方式让我们看到了数据美丽的一面。这是本文档第一部分

音乐相关

Narratives 2.0

将不同声轨的音乐用该系统进行分析,下面是贝多芬第五交响曲的样子。

 

Liveplasma

输入乐队,歌手,电影,演员的名字,该工具会帮你列出他们之间的关联。

 

Tuneglue

输入任何歌手或乐队的名字,点搜索,可以以该乐队或歌手为中心向外扩展,找到与之关联的更多资料。

 

MusicMap

和 TuneGlue 的界面类似,搜索一个乐队或歌手,会列出他们全部专辑,选中一个专辑,并以此为中心可以发现更多相关专辑和资料。

 

Last.Forward

一个可下载的,开源工具,用来分析 Last.fm 用户的社会网络。

 

Fidg’t

一个桌面工具,根据 Flickr 和 Last.fm 中的 Tag 分析你的 Web 活动倾向。

 

Digg, Twitter, Delicious, Flickr 相关

Looks Del.icio.us

Delicious 的书签分析图形,基于 python 下的一个图形库。

 

Arc

来自 Digg 实验室的一个产品,显示最新的 Diggs 及那些发布和分享这些 Digg 的用户关系。

 

Stack

Digg 提供的最实际用的数据分析工具,实时显示 Digg 当前的活动状况,什么文章最受欢迎等。

 

Swarm

Digg 实验室出品的分析工具中,用户界面较好的一个,文章和用户分散到屏幕上,当某人 Digg 了一篇文章,这个用户就会飞到那篇文章旁边并建立链接,还可以将这个工具作为屏保安装。

 

Research Chronology

在学生本学期的功课和 Delicious 书签之间建立关联,该项目将继续包括的书签站点超过270个。

 

TwittEarth

在一个 3D 地球模型上实时显示 Twitter 全球活跃状况,显示 Twitter 上那些 Tweets 来自什么地区,什么地区的人在跟。只是坐在那里观赏也很奇妙。

 

Tag Galaxy

搜索 Flickr 的标签,并将它们显示在一个虚拟的星系中。

 

Flickr Related Tag Browser

搜索 Flickr 标签与相关标签,点击不同标签,显示相关标签,点击选中的标签,可以看到该标签下对应的 Flickr 图片库。

 

Internet 分析

Mapping the Blogosphere

全球博客圈的分布图。

 

Twingly Screensaver

全球博客圈的实时活跃状况图。

 

Web Trend Map 4

显示当前全球网络在线趋势图,目前是第四版。

 

The Bloom Diagram

来自 IBM Watson 研究中心的一个项目,显示开源项目的活跃状况。

 

Akami Real-time Web Monitor

在一张世界地图上实时显示全球互联网流量,以及当前网络攻击状况,使用颜色区分不同活动。

 

Mapa de Conocimiento (Map of Knowledge)

对某些课题的知识分布图,基于 Flash,将一些主要课题的链接地址组织到一起,目前只有英文和西班牙文版本。

 

Akami Network Performance Comparison

显示不同城市之间互谅网连接速度及丢包情况。(可以帮我们验证世界上最远的距离不是北京和纽约,而是网通和电信,现在是联通和电信)

 

Internet Health Report

使用网格,显示全球主要 ISP 和骨干网之间潜在的丢包以及网络活动状况。

Hierarchical Structure of the Internet

显示了 Internet 是如何组织的,可以看到,Internet 的核心是大约80个主要节点,不过即使这些核心节点出现故障,其余的70%的节点也会以点对点模式继续保持 Internet 运转。

 

Rootzmap—Mapping the Internet

Internet 地图。由 NASA 提供, Philippe Bourcier 设计。

 

Websites as Graphs

显示一个网站源代码中的标签地图,不同颜色代表不同标签,比如蓝色代表链接,红色代表 table。

 

Schemaball

SQL 数据库结构图,基于表之间的外键,显示表间的关联。

 

Opte Project

显示世界上所有 C 网段结构图,目的是为全球互联网建立一个完整的地图。

本文国际来源:http://www.webdesignerdepot.com/2009/06/50-great-examples-of-data-visualization/
中文翻译来源:COMSHARP CMS 官方网站

Posted in 其它, 分析报告.

Tagged with .


Sphinx搜索语法

参考:http://www.coreseek.com/uploads/pdf/sphinx_doc_zhcn_0.9.pdf

1.匹配模式
有如下可选的匹配模式:

  • SPH_MATCH_ALL, 匹配所有查询词(默认模式)
  • SPH_MATCH_ANY, 匹配查询词中的任意一个
  • SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配
  • SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式
  • SPH_MATCH_EXTENDED, 将查询看作一个Sphinx内部查询语言的表达式

还有一个特殊的“完整扫描”模式,当如下条件满足时,该模式被自动激活:

1. 查询串是空的(即长度为零)
2. docinfo 存储方式为extern
在完整扫描模式中,全部已索引的文档都被看作是匹配的。这类匹配仍然会被过滤、排序或
分组,但是并不会做任何真正的全文检索。这种模式可以用来统一全文检索和非全文检索的
代码,或者减轻SQL服务器的负担(有些时候Sphinx扫描的速度要优于类似的MySQL查
询)

2. 布尔查询
布尔查询允许使用下列特殊操作符:
 显式的与(AND)操作符
hello & world
 或(OR)操作符
hello | world
 非(NOT)操作符
hello -world
hello !world
 分组(grouping)
( hello world )
以下是一个使用了如上全部操作符的例子:

布尔查询示例
( cat -dog ) | ( cat -mouse)

与(AND)操作符为默认操作,所以“hello world”其实就是“hello & world”
或(OR)操作符的优先级高于与操作符,因此“lookingfor cat | dog | mouse”意思是”looking for (
cat | dog | mouse )” 而不是 “(looking for cat) | dog | mouse”
像“-dog”这种查询不能被执行,因为它差不多包括索引所有文档。这既有技术上的原因,
也有性能上的原因。从技术上说,Sphinx并不总是保持一个全部文档ID的列表。性能方面,
当文档集非常大的时候(即10-100M个文档),对这种执行查询可能需要很长的时间。

3. 扩展查询
在扩展查询模式中可以使用如下特殊操作符:
 或(OR)操作符
hello | world
 非(NOT)操作符
hello -world
hello !world
 字段(field)搜索符:
@title hello @body world
 词组搜索符
“hello world”
 近似搜索符
“hello world”~10
 阀值匹配符
“the world is a wonderful place”/3
下例使用了上述大多数操作符:

扩展查询示例
“hello world” @title “example program”~5 @body python -(php|perl)
与(AND)操作为默认操作,因此“hello world”意思是“hello”和“world”必须同时存在文档才
能匹配。
或(OR)操作符的优先级要高于与操作符,因此”looking for cat | dog | mouse” 意思
是”looking for ( cat | dog | mouse )” 而不是”(looking for cat) | dog | mouse”;
近似距离以词为单位,随词数变化而变化,并应用于引号中的全部词。举个例子,”cat dog
mouse”~5 这个查询的意思是必须有一个少于8个词的词串,它要包含全部的三个词,也就
是说”CAT aaa bbb ccc DOG eee fff MOUSE” 这个文档不会匹配这个查询,因为这个词串正好
是8个词。
阀值匹配符引入了一种模糊匹配。它允许至少含有某个阈值数量个匹配词的文档通过。上述
例子(”the world is a wonderful place”/3)会匹配含有指定的六个词中的至少三个的那些文档。
类似如下查询中嵌套的括号
aaa | ( bbb ccc | ( ddd eee ) )
目前还是不允许的,但是这会在今后得以改进。
取否(也就是非(NOT)操作符)只允许用在最外一层且不能在括号(也就是分组)里。这
个特性不会改变,因为支持嵌套的非操作会大大提高词组相关度计算实现的复杂性。

4. 权值计算
采用何种权值计算函数(目前)取决于查询的模式。
There are these major parts which are used in the weighting functions:
权值计算函数进行如下两部分主要部分:
1. 词组评分
2. 统计学评分
词组评分根据文档和查询的最长公共子串(LCS,longest common subsequence)的长度进行。
因此如果文档对查询词组有一个精确匹配(即文档直接包含该词组),那么它的词组评分就
取得了可能的最大值,也就是查询中词的个数。
统计学评分基于经典的BM25函数,该函数仅考虑词频。如果某词在整个数据库中很少见
(即文档集上的低频词)或者在某个特定文档中被经常提及(即特定文档上的高频词),那
么它就得到一个较高的权重。最终的BM25权值是一个0到1之间的浮点数。
在所有模式中,数据字段的词组评分是LCS乘以用户指定的数据字段权值。数据字段权值
是整数,默认为1,且字段的权值必须不小于1。
在SPH_MATCH_BOOLEAN模式中,不做任何权重估计,每一个匹配项的权重都是1。
在SPH_MATCH_ALL和SPH_MATCH_PHRASE模式中,最终的权值是词组评分的加权和。
在SPH_MATCH_ANY模式中,于前面述两模式的基本思想类似,只是每个数据字段的权重
都再加上一个匹配词数目。在那之前,带权的词组相关度被额外乘以一个足够大的数,以便
确保任何一个有较大词组评分的数据字段都会使整个匹配的相关度较高,即使该数据字段的
权重比较低。
在SPH_MATCH_EXTENDED模式中,最终的权值是带权的词组评分和BM25权重的和,再
乘以1000并四舍五入到整数。
这个行为将会被修改,以便使MATCH_ALL和MATCH_ANY这两个模式也能使用BM25算
法。这将使词组评分相同的搜索结果片断得到改进,这在只有一个词的查询中尤其有用。
关键的思想(对于除布尔模式以外的全部模式中)是子词组的匹配越好则评分越高,精确匹
配(匹配整个词组)评分最高。作者的经验是,这种基于词组相似性的评分方法可以提供比
任何单纯的统计模型(比如其他搜索引擎中广泛使用的BM25)明显更高的搜索质量。

5. 排序模式
可使用如下模式对搜索结果排序:
 SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)
 SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)
 SPH_SORT_ATTR_ASC模式, 按属性升序排列(属性值越小的越是排在前面)
 SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按
相关度降序
 SPH_SORT_EXTENDED 模式, 按一种类似SQL的方式将列组合起来,升序或降序排
列。
 SPH_SORT_EXPR 模式,按某个算术表达式排序。
SPH_SORT_RELEVANCE忽略任何附加的参数,永远按相关度评分排序。所有其余的模式
都要求额外的排序子句,子句的语法跟具体的模式有关。SPH_SORT_ATTR_ASC,
SPH_SORT_ATTR_DESC以及SPH_SORT_TIME_SEGMENTS这三个模式仅要求一个属性名。
SPH_SORT_RELEVANCE模式等价于在扩展模式中按”@weight DESC, @id ASC”排序,
SPH_SORT_ATTR_ASC 模式等价于”attribute ASC, @weight DESC, @id ASC”,而
SPH_SORT_ATTR_DESC 等价于”attribute DESC, @weight DESC, @id ASC”。
SPH_SORT_TIME_SEGMENTS模式
在SPH_SORT_TIME_SEGMENTS模式中,属性值被分割成“时间段”,然后先按时间段排
序,再按相关度排序。
时间段是根据搜索发生时的当前时间戳计算的,因此结果随时间而变化。所说的时间段有如
下这些值:
 最近一小时
 最近一天
 最近一星期
 最近一个月
 最近三个月
 其他值
时间段的分法固化在搜索程序中了,但如果需要,也可以比较容易地改变(需要修改源码)。
这种模式是为了方便对Blog日志和新闻提要等的搜索而增加的。使用这个模式时,处于更
近时间段的记录会排在前面,但是在同一时间段中的记录又根据相关度排序-这不同于单纯
按时间戳排序而不考虑相关度。
SPH_SORT_EXTENDED 模式
在 SPH_SORT_EXTENDED 模式中,您可以指定一个类似SQL的排序表达式,但涉及的属
性(包括内部属性)不能超过5个,例如:
@relevance DESC, price ASC, @id DESC
只要做了相关设置,不管是内部属性(引擎动态计算出来的那些属性)还是用户定义的属性
就都可以使用。内部属性的名字必须用特殊符号@开头,用户属性按原样使用就行了。在上
面的例子里,@relevance和@id是内部属性,而price是用户定义属性。
已知的内部属性:
 @id (match ID)
 @weight (match weight)
 @rank (match weight)
 @relevance (match weight)
 @id(匹配的ID)
 @weight(匹配权值)
 @rank(匹配权值)
 @relevance(匹配权值)
@rank和@relevance只是@weight的额外别名。
SPH_SORT_EXPR 模式
表达式排序模式使您可以对匹配项按任何算术表达式排序,表达式中的项可以是属性值,内
部属性(@id和@weight),算术运算符和一些内建的函数。例如:
$cl->SetSortMode ( SPH_SORT_EXPR,
“@weight + ( user_karma + ln(pageviews) )*0.1” );
支持的运算符和函数如下。它们是模仿MySQL设计的。函数接受参数,参数的数目根据具
体函数的不同而不同。
 Operators: +, -, *, /, <, > <=, >=, =, <>.
 Unary (1-argument) functions: abs(), ceil(), floor(), sin(), cos(), ln(), log2(), log10(), exp(),
sqrt().
 Binary (2-argument) functions: min(), max(), pow().
 Ternary (3-argument) functions: if().
 运算符: +, -, *, /, <, > <=, >=, =, <>.
 一元函数(一个参数):abs(), ceil(), floor(), sin(), cos(), ln(), log2(), log10(), exp(),
sqrt().
 二元函数(两个参数):min(), max(), pow().
 三元函数(三个参数):if().
全部的计算都以单精度32位IEEE754浮点数进行。比较操作符(比如=和<=)在条件为真 时返回1.0,否则返回0.0。例如(a=b)+3在属性“a”与属性“b”相等时返回4,否则返回 3。与MySQL不同,相等性比较符(即=和<>)中引入了一个小的阈值(默认是1e-6)。
如果被比较的两个值的差异在阈值之内,则二者被认为相等。
全部的一元和二元函数的意义都很明确,他们的行为跟在数学中的定义一样。但IF()的行为
需要点详细的解释。它接受3个参数,检查第一个参数是否为0.0,若非零则返回第二个参
数,为零时则返回第三个参数。注意,与比较操作符不同,IF()并不使用阈值!因此在第一
个参数中使用比较结果是安全的,但使用算术运算符则可能产生意料之外的结果。比如,下
面两个调用会产生不同的结果,虽然在逻辑上他们是等价的:
IF ( sqrt(3)*sqrt(3)-3<>0, a, b )
IF ( sqrt(3)*sqrt(3)-3, a, b )
在第一种情况下,由于有阈值,比较操作符<>返回0.0(逻辑假),于是IF()总是返回
‘b’。在第二种情况下,IF()函数亲自在没有阈值的情况下将同样的
sqrt(3)*sqrt(3)-3与零值做比较。但由于浮点数运算的精度问题,该表达式的结果与
0值会有微小的差异,因此该值与零值的相等比较不会通过,上述第二种情况中IF()会返
回‘a’做为结果。

6. 结果分组(聚类)
有时将搜索结果分组(或者说“聚类”)并对每组中的结果计数是很有用的-例如画个漂亮
的图来展示每个月有多少的blog日志,或者把Web搜索结果按站点分组,或者把找到的论
坛帖子按其作者分组。
理论上,这可以分两步实现:首先在Sphinx中做全文检索,再在SQL服务器端对得到的ID
分组。但是现实中在大结果集(10K到10M个匹配)上这样做通常会严重影响性能。
为避免上述问题,Sphinx提供了一种“分组模式”,可以用API调用SetGroupBy()来开启。
在分组时,根据group-by值给匹配项赋以一个分组。这个值用下列内建函数之一根据特定的
属性值计算:
 SPH_GROUPBY_DAY,从时间戳中按YYYYMMDD格式抽取年、月、日
 SPH_GROUPBY_WEEK,从时间戳中按YYYYNNN格式抽取年份和指定周数(自年
初计起)的第一天
 SPH_GROUPBY_MONTH,从时间戳中按YYYYMM格式抽取月份
 SPH_GROUPBY_YEAR,从时间戳中按YYYY格式抽取年份
 SPH_GROUPBY_ATTR,使用属性值自身进行分组
最终的搜索结果中每组包含一个最佳匹配。分组函数值和每组的匹配数目分别以“虚拟”属
性@group和@count的形式返回。
结果集按group-by排序子句排序,语法与SPH_SORT_EXTENDED 排序子句的语法相似。除
了@id和@weight,分组排序子句还包括:
 @group(groupby函数值)
 @count(组中的匹配数目)
默认模式是根据groupby函数值降序排列,即按照“@group desc”
排序完成时,结果参数total_found会包含在整个索引上匹配的组的总数目。
注意:分组操作在固定的内存中执行,因此它给出的是近似结果;所以total_found报告的数
目可能比实际给出的个分组数目的和多。@count也可能被低估。要降低不准确性,应提高
max_matches。如果max_matches允许存储找到的全部分组,那结果就是百分之百准确的。
例如,如果按相关度排序,同时用SPH_GROUPBY_DAY函数按属性“published”分组,那
么:
 结果中包含每天的匹配结果中最相关的那一个,如果那天有记录匹配的话。
 结果中还附加给出天的编号和每天的匹配数目
 结果以天的编号降序排列(即最近的日子在前面)

7. 分布式搜索
为提高可伸缩性,Sphnix提供了分布式检索能力。分布式检索可以改善查询延迟问题(即缩
短查询时间)和提高多服务器、多CPU或多核环境下的吞吐率(即每秒可以完成的查询
数)。这对于大量数据(即十亿级的记录数和TB级的文本量)上的搜索应用来说是很关键
的。
其关键思想是将待搜索数据做水平分区(HP,Horizontally partition),然后并行处理。
分区不能自动完成,您需要:
 在不同服务器上设置Sphinx程序集(indexer和searchd)的多个实例
 让这些实例对数据的不同部分做索引(并检索)
 在searchd的一些实例上配置一个特殊的分布式索引
 然后对这个索引进行查询
这个特殊索引只包括对其他本地或远程索引的引用,因此不能对它执行重新建立索引的操作,
相反,如果要对这个特殊索引进行重建,要重建的是那些被这个索引被引用到的索引。
当searchd收到一个对分布式索引的查询时,它做如下操作:
1. 连接到远程代理
2. 执行查询
3. (在远程代理执行搜索的同时)对本地索引进行查询
4. 接收来自远程代理的搜索结果
5. 将所有结果合并,删除重复项
6. 将合并后的结果返回给客户端
在应用程序看来,普通索引和分布式索引完全没有区别。
任一个searchd实例可以同时做为主控端(master,对搜索结果做聚合)和从属端(只做本地
搜索)。这有如下几点好处:
1. 集群中的每台机器都可以做为主控端来搜索整个集群,搜索请求可以在主控端之间获
得负载平衡,相当于实现了一种HA(high availability,高可用性),可以应对某个
节点失效的情况。
2. 如果在单台多CPU或多核机器上使用,一个做为代理对本机进行搜索的searchd实例
就可以利用到全部的CPU或者核。
更好的HA支持已在计划之中,到时将允许指定哪些代理之间互相备份、有效性检查、跟踪
运行中的代理、对检索请求进行负载均衡,等等。

8. searchd 日志格式
searchd将全部成功执行的搜索查询都记录在查询日志文件中。以下是一个类似记录文件的
例子:
[Fri Jun 29 21:17:58 2007] 0.004 sec [all/0/rel 35254 (0,20)] [lj] test
[Fri Jun 29 21:20:34 2007] 0.024 sec [all/0/rel 19886 (0,20) @channel_id] [lj]
test
日志格式如下
[query-date] query-time [match-mode/filters-count/sort-mode
total-matches (offset,limit) @groupby-attr] [index-name] query
匹配模式(match-mode)可以是如下值之一:
 “all” 代表 SPH_MATCH_ALL 模式;
 “any” 代表 SPH_MATCH_ANY 模式;
 “phr” 代表 SPH_MATCH_PHRASE 模式;
 “bool” 代表 SPH_MATCH_BOOLEAN 模式;
 “ext” 代表 SPH_MATCH_EXTENDED 模式.
排序模式(sort-mode)可以取如下值之一:
 “rel” 代表 SPH_SORT_RELEVANCE 模式;
 “attr-” 代表 SPH_SORT_ATTR_DESC 模式;
 “attr+” 代表 SPH_SORT_ATTR_ASC 模式;
 “tsegs” 代表 SPH_SORT_TIME_SEGMENTS 模式;
 “ext” 代表 SPH_SORT_EXTENDED 模式.

Posted in sphinx, 技术.

Tagged with .


Sphinx增量索引

Sphinx+Mysql+中文分词安装

在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我们会发现,每天我们需要更新的数据相比较而言较少,在这种情况下我们就需要使用“主索引+增量索引”的模式来实现实时更新的功能。

这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率我们可以设置的长一些(可以设置在每天的午夜进行更新),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。

下面,我们通过一个简单的例子来描述一下怎样实现这种模式

以sphinx.conf中默认的数据为例:

1.先在mysql中插入一个计数表和两个索引表

CREATE TABLE sph_counter(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);

//主索引使用(确认之前是否已经建立过该表,如果已经建立,这里就不需要重新建了)

CREATE TABLE `sphinx` (
`id` int(11) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
`CATALOGID` INT NOT NULL,
`EDITUSERID` INT NOT NULL,
`HITS` INT NULL,
`ADDTIME` INT NOT NULL, KEY
`Query` (`Query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/test1′

//增量索引使用

CREATE TABLE `sphinx1` (
`id` int(11) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
`CATALOGID` INT NOT NULL,
`EDITUSERID` INT NOT NULL,
`HITS` INT NULL,
`ADDTIME` INT NOT NULL, KEY
`Query` (`Query`)
)ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/ test1stemmed ‘

2.修改sphinx.conf

source src1
{
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents \
WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) ... //其他可以默认 } // 注意:sql_query_pre的个数需和src1对应,否则可能搜索不出相应结果 source src1throttled : src1 { sql_ranged_throttle = 100 sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF sql_query_pre = sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents \ WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

index test1 //主索引
{
source = src1

}

index test1stemmed : test1 //增量索引
{
source = src1throttled

}

3.重建索引

/usr/local/sphinx/bin/searchd –stop
/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all
/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf

插入测试数据

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

执行

SELECT doc . *
FROM documents doc
JOIN sphinx ON ( doc.id = sphinx.id )
WHERE query = ‘索引’

你会发现你刚添加的数据没有被检索出来
然后执行:

SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=’索引’

你会发现数据是空的,这时我们就需要来更新增量索引了。

通过执行:

/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1stemmed

命令来更新增量索引(正式使用时,我们可以将该命令配置到系统计划任务中,每隔几分钟执行一次)
–rotate: 该参数可以使我们在不需要停止searchd的情况下,直接加载索引
执行完命令该命令后,我们再来查看一下增量索引的数据


SELECT doc.* FROM documents doc join sphinx1 on (doc.id=sphinx1.id) where query=’索引’

你会发现新添加的数据被检索出来的。

主索引的更新:

/usr/local/sphinx/bin/indexer –rotate –config /usr/local/sphinx/etc/sphinx.conf test1


collected 997 docs, 1.4 MB
sorted 0.3 Mhits, 100.0% done
total 997 docs, 1430054 bytes
total 1.428 sec, 1001459.38 bytes/sec, 698.19 docs/sec

(我们可以设置成每天的午夜执行)

只有在更新了主索引后,结果才会被更新

SELECT doc.* FROM documents doc join sphinx on (doc.id=sphinx.id) where query=’索引’

我们也可以通过合并索引的方式使主索引的数据保持更新

/usr/local/sphinx/bin/indexer –merge test1 test1stemmed –rotate

可以将增量索引test1stemmed合并到主索引test1中去

为创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)

1.创建主索引脚本build_main_index.sh

#!/bin/sh
#/usr/local/sphinx/bin/searchd –stop
/usr/local/sphinx/bin/indexer test1 –config /usr/local/sphinx/etc/sphinx.conf >> /var/log/sphinx/mainindexlog
#/usr/local/sphinx/bin/searchd

2.创建增量索引脚本build_delta_index.sh

#!/bin/sh
#/usr/local/sphinx/bin/searchd –stop
/usr/local/sphinx/bin/indexer test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate>> /var/log/sphinx/deltaindexlog
/usr/local/sphinx/bin/indexer –merge test1 test1stemmed –config /usr/local/sphinx/etc/sphinx.conf –rotate >> /var/log/sphinx/deltaindexlog
#/usr/local/sphinx/bin/searchd

每隔5分钟进行索引增量合并,每天2:30重建索引

*/5 * * * * /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
30 2* * * /bin/sh /opt/shell/build_main_index.sh > /dev/null 2>&1

每周一至周六上早6点增量合并,同日重建索引

1 6 * * 1-6 /bin/sh /opt/shell/build_delta_index.sh > /dev/null 2>&1
1 6 * * 7 /bin/sh /opt/shell/build_main_index.sh > /dev/null 2>&1

参考:
http://www.coreseek.com/uploads/pdf/sphinx_doc_zhcn_0.9.pdf

2009-06-26修订

Posted in sphinx, 技术.

Tagged with , .


Sphinx+Mysql+中文分词安装-实现中文全文搜索

什么是Sphinx
Sphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)
需要联系我们(Sphinxsearch.com)以获得商业授权。
一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果
相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。
当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式
的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS
的原生支持)。
搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索
API非常简单,可以在若干个小时之内移植到新的语言上。
Sphinx 是SQL Phrase Index的缩写,但不幸的和CMU的Sphinx项目重名

Sphinx的特性

  • 高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
  • 高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
  • 可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可
    处理100 M 文档);
  • 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法;
  • 支持分布式搜索;
  • provides document exceprts generation;
  • 可作为MySQL的存储引擎提供搜索服务;
  • 支持布尔、短语、词语相似度等多种检索模式;
  • 文档支持多个全文检索字段(最大不超过32个);
  • 文档支持多个额外的属性信息(例如:分组信息,时间戳等);
  • 停止词查询;
  • 支持单一字节编码和UTF-8编码;
  • 原生的MySQL支持(同时支持MyISAM 和InnoDB );
  • 原生的PostgreSQL 支持.

一、安装所需文件
mmseg-0.7.3.tar.gz 中文分词
http://www.coreseek.com/uploads/sources/mmseg-0.7.3.tar.gz

mysql-5.1.26-rc.tar.gz mysql-5.1.26源代码

sphinx-0.9.8-rc2.tar.gz sphinx-0.9.8-rc2源代码
http://www.sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz

fix-crash-in-excerpts.patch sphinx支持分词补丁
http://www.coreseek.com/uploads/sources/fix-crash-in-excerpts.patch

sphinx-0.98rc2.zhcn-support.patch sphinx支持分词补丁
http://www.coreseek.com/uploads/sources/sphinx-0.98rc2.zhcn-support.patch

二、开始安装
1.安装libmmseg


tar -zxvf mmseg-0.7.3.tar.gz
cd mmseg-0.7.3
./configure –prefix=/usr/local/mmseg
make
make install
cd ..

安装mmseg完成,测试一下

mmseg
Coreseek COS(tm) MM Segment 1.0
Copyright By Coreseek.com All Right Reserved.
Usage: mmseg

有问题可以尝试执行下面命令

echo ‘/usr/local/mmseg/lib’ >> /etc/ld.so.conf
ldconfig -v
ln -s /usr/local/mmseg/bin/mmseg /bin/mmseg

=================2011-08-26 更新=================

在centos6 g++4.4.4上编辑错误

css/UnigramCorpusReader.cpp: In member function ‘virtual int css::UnigramCorpusReader::open(const char*, const char*)’:
css/UnigramCorpusReader.cpp:89: error: ‘strncmp’ was not declared in this scope
make[2]: *** [UnigramCorpusReader.lo] Error 1
make[2]: Leaving directory `/root/src/sphinx/mmseg-0.7.3/src’
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/src/sphinx/mmseg-0.7.3′
make: *** [all] Error 2

解决方法
vi .src/css/UnigramCorpusReader.cpp
第一行加上

#include

然后重新 make
===================================================

2.重新编译mysql
在安装之前先打两个补丁,这个是支持中文必须打的补丁

tar -zxvf sphinx-0.9.8-rc2.tar.gz
cd sphinx-0.9.8
patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch patch -p1 < ../fix-crash-in-excerpts.patch

之前我已安装了mysql5.1.26,这里略过具体安装步骤
mysql编译路径
/root/lemp/mysql-5.1.26-rc/
mysql安装路径
/opt/mysql

安装之前关闭mysql

/opt/mysql/bin/mysql.server stop

接着将sphinx下的mysqlse 文件夹下的数据拷贝到mysql-5.1.26-rc/storage/sphinx 下面
(这样才能在编译mysql的时候把SphinxSE存储引擎编译进去)

cp -rf mysqlse /root/lemp/mysql-5.1.26-rc/storage/sphinx
cd /root/lemp/mysql-5.1.26-rc

make clean
sh BUILD/autorun.sh
#这步是必须的,请勿遗漏

开始重新编译

CFLAGS=”-O3″ CXX=gcc CXXFLAGS=”-O3 -felide-constructors -fno-exceptions -fno-rtti” ./configure –prefix=/opt/mysql –localstatedir=/opt/mysql/var –sysconfdir=/opt/mysql –without-debug –with-unix-socket-path=/opt/mysql/mysql.sock –with-big-tables –with-charset=gbk –with-collation=gbk_chinese_ci –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –enable-assembler –with-extra-charsets=gbk,gb2312,utf8 –with-pthread –enable-thread-safe-client –with-innodb –with-plugins=sphinx
make
make install


configure: error: unknown plugin: sphinx

我的解决方法:
重新解压一份mysql source
在执行autorun.sh前修改storage/sphinx的用户和用户组,还有权限
sh BUILD/autorun.sh
./configure -h
查看最低下有否包含了sphinx

=== Sphinx Storage Engine ===
Plugin Name: sphinx
Description: Sphinx Storage Engines
Supports build: static and dynamic
Configurations: max, max-no-ndb

然后再编译

make时错误

../libtool: line 466: CDPATH: command not found
../libtool: line 1144: func_opt_split: command not found
libtool: Version mismatch error. This is libtool 2.2.6, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.2.6
libtool: and run autoconf again.
make[1]: *** [conf_to_src] 错误 63
make[1]: Leaving directory `/home/andychu/lemp2/mysql-5.1.26-rc/strings’
make: *** [all-recursive] 错误 1

libtool版本不一至产生错误,可以将已安装的libtool覆盖到编译目录
cp /usr/local/bin/libtool .
再重新编译

编译完成,启动mysql,检查SphinxSE存储引擎是否编译进去

/opt/mysql/bin/mysql.server start
/opt/mysql/bin/mysql -uroot -p

Mysql>
输入
show engines;

+————+———+———————————————————–+————–+—-+————+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+————+———+———————————————————–+————–+—-+————+
| CSV | YES | CSV storage engine | NO | NO | NO |
| SPHINX | YES | Sphinx storage engine 0.9.8 | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
+————+———+———————————————————–+————–+—-+————+
5 rows in set (0.00 sec)

此时我们可以看到已经包含sphinxSE 引擎

3.安装sphinx

cd /root/lemp/sphinx-0.9.8-rc2
./configure –prefix=/usr/local/sphinx –with-mysql=/opt/mysql \
–with-mysql-includes=/opt/mysql/include/mysql –with-mysql-libs=/opt/mysql/lib/mysql \
–with-mmseg-includes=/usr/local/mmseg/include –with-mmseg-libs=/usr/local/mmseg/lib –with-mmseg
make

头文件没找到:

tokenizer_zhcn.cpp:1:30: SegmenterManager.h: 没有那个文件或目录
tokenizer_zhcn.cpp:2:23: Segmenter.h: 没有那个文件或目录


make clean
./configure –prefix=/usr/local/sphinx –with-mysql=/opt/mysql \
–with-mysql-includes=/opt/mysql/include/mysql –with-mysql-libs=/opt/mysql/lib/mysql \
–with-mmseg-includes=/usr/local/mmseg/include/mmseg –with-mmseg-libs=/usr/local/mmseg/lib –with-mmseg


/root/sphinx/sphinx-0.9.8-rc2/src/tokenizer_zhcn.cpp:34: undefined reference to `libiconv_close’
collect2: ld returned 1 exit status

官网解决办法:
In the meantime I’ve change the configuration file and set
#define USE_LIBICONV 0 in line 8179.
修改configure 文件把 #define USE_LIBICONV 0 最后的数值由1改为0
重新编译。


make clean
./configure –prefix=/usr/local/sphinx –with-mysql=/opt/mysql \
–with-mysql-includes=/opt/mysql/include/mysql –with-mysql-libs=/opt/mysql/lib/mysql \
–with-mmseg-includes=/usr/local/mmseg/include/mmseg –with-mmseg-libs=/usr/local/mmseg/lib –with-mmseg

vi configure
输入/define USE_LIBICONV 找到目标行
按i键后将1改成0,按esc,输入:wq保存退出

make
make install

编译时报如下的错误
/usr/local/include/mmseg/freelist.h:22: error: ‘strlen’ was not declared in this scope
vi /usr/local/include/mmseg/freelist.h
或者这个地址
vi /usr/local/mmseg/include/mmseg/freelist.h
加上

#include

再次编译就不会报错了。

复制一份sphinx的配置

cd /usr/local/sphinx/etc
cp sphinx.conf.dist sphinx.conf

4.配置sphinx

修改/usr/local/sphinx/etc/sphinx.conf

type = mysql
# some straightforward parameters for SQL source types
sql_host = localhost
sql_user = root
sql_pass =
sql_db = test
sql_port = 3306 # optional, default is 3306

address = 127.0.0.1 #安全点可以只监听本机

5.索引建立

装好sphinx后在sphinx的目录中有三个目录 分别为bin etc var
bin中 存有sphinx用到的一些执行文件 包括 indexer 索引建立 search 查询工具 searchd 查询服务器 等

为了下面测试方便,我们先将sphinx.conf自带的example.sql脚本倒入的mysql中
//创建了一个test库,并建立了documents测试表和数据

/opt/mysql/bin/mysql -uroot -p < /usr/local/sphinx/etc/example.sql

索引的建立方法为

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf test1

test1为资源名称 不写为默认所有都建立索引
附:
建立索引期间可能由于不同版本的数据库导致indexer找不到共享库libmysqlclient.so.16
需要把/opt/mysql/lib/mysql/libmysqlclient.so.16.0.0 这个文件复制到/usr/lib下 或者作软连接即可

6.查询服务器

/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf 为开启

/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf –stop 为关闭

sphinx的查询 可以大致分为三种

1 数据库引擎中的查询

2 通过search工具查询
/usr/local/sphinx/bin/search –config /usr/local/sphinx/etc/sphinx.conf test

3 通过php的接口查询 详见sphinxapi.php.

三、在mysql中的使用SphinxSE方式调用Sphinx

1.在mysql中的使用SphinxSE方式调用Sphinx
首先建立一张索引专用表:

CREATE TABLE `sphinx` (
`id` int(11) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
`CATALOGID` INT NOT NULL,
`EDITUSERID` INT NOT NULL,
`HITS` INT NULL,
`ADDTIME` INT NOT NULL, KEY
`Query` (`Query`)
) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION=’sphinx://localhost:3312/test1′

test1:索引的名称,可以在sphinx.conf中查找到
建立完索引专用表后,我们就可以在mysql中使用它了,例如,在mysql中输入

SELECT doc. * FROM documents doc JOIN sphinx ON ( doc.id = sphinx.id ) WHERE query = ‘doc;mode= any’

运行后,结果记录中将会显示包含doc字符串的所用记录行

关于query的语法,还有sphinx的配置等信息你可以请参考:
http://www.sphinxsearch.com/doc.html

2.中文分词应用
生成词典
进入到mmseg的源代码目录后

cd data
mmseg -u unigram.txt

在data下边会产生一个文件unigram.txt.uni
这个就是生成的字典 然后把字典改名为uni.lib放在可以读取的目录中即可

cp unigram.txt.uni /usr/local/sphinx/uni.lib

修改 sphinx.conf(/usr/local/sphinx/etc/sphinx.conf)配置文件
在索引中加入

charset_type = zh_cn.utf-8
charset_dictpath = /usr/local/sphinx/

数据库中增加一条中文数据

INSERT INTO `test`.`documents` (
`id` ,
`group_id` ,
`group_id2` ,
`date_added` ,
`title` ,
`content`
)
VALUES (
NULL , ‘3’, ‘9’, NOW( ) , ‘sphinx中文搜索’, ‘Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 ‘
);

(如果searchd已经再运行,先kill 它再运行)
注意:在添加完数据后,需要重新加载索引,这样新的数据才能被缓存进去
重建索引,成功后,开启索引监听

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all
/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf

在ide硬盘上建索引的速度

indexing index ‘test1’…
collected 423228 docs, 637.2 MB
sorted 125.5 Mhits, 100.0% done
total 423228 docs, 637201412 bytes
total 753.401 sec, 845766.13 bytes/sec, 561.76 docs/sec

这样,就可以在phpmyadmin中进行测试了。

SELECT doc. * FROM documents doc JOIN sphinx ON ( doc.id = sphinx.id )
WHERE query = ‘设计;mode= any ‘

好像没出来。。。。

修改 sphinx.conf
去掉下面的注释

sql_query_pre = SET NAMES utf8

再重启searchd就可以搜出结果了

参考:
http://www.coreseek.com/uploads/pdf/sphinx_doc_zhcn_0.9.pdf
http://www.sphinxsearch.com/wiki/doku.php?id=sphinx_chinese_tutorial
http://www.cnblogs.com/hushixiu/articles/1295605.html
http://blog.xoyo.com/dcyhldcyhl/article/839863.shtml
http://blog.sina.com.cn/s/blog_5aefd9770100axf1.html
http://blog.s135.com/post/360/

2009-06-28更新
编码的解决方法(未经测试)
——————————————————————————-
转换现有表的数据
iconv -f GB18030 -t utf-8 -o dump.sql dump_utf8.sql

也可以不转换,直接使用现有的GBK的数据,但是需要设置连接方式
mysql_query(“SET character_set_client = ‘gbk'”, $conn);
mysql_query(“SET character_set_connection =’gbk'”, $conn); //设置character_set_connection也就同时设置了collation_connection
//mysql_query(“SET collation_connection = ‘gbk'”, $conn);
mysql_query(“SET character_set_results =’utf8′”, $conn);
这三个设置后,查询得到的结果,就是UTF8编码的结果了。合适给SPHINX使用。

mysql_query(“SET SESSION query_cache_type=OFF”, $conn);
//indexer建立索引时的查询,不需要缓存的
——————————————————————————-

2009-06-28更新
coreseek网站好像出问题不能下载咯。
提供安装部分文件下载,共3.6M,包含以下文件
build_delta_index.sh
build_main_index.sh
fix-crash-in-excerpts.patch
mmseg-0.7.3.tar.gz
sphinx-0.9.8-rc2.tar.gz
sphinx-0.98rc2.zhcn-support.patch
sphinx.conf
sphinxapi.php
test.php
test2.php

>>猛击这里下载sphinx安装文件

——————————————————————————-

2009-06-28更新
使用service 控制sphinx
先增加一sphinx用户并属于website组(事先已存在),并修改sphinx目录的属主

useradd -d /usr/local/sphinx -g website -s /sbin/nologin sphinx
chown -R sphinx:website /usr/local/sphinx

创建/etc/init.d/sphinx脚本

#!/bin/sh
# sphinx: Startup script for Sphinx search
#
# chkconfig: 345 86 14
# description: This is a daemon for high performance full text \
# search of MySQL and PostgreSQL databases. \
# See http://www.sphinxsearch.com/ for more info.
#
# processname: searchd
# pidfile: $sphinxlocation/var/log/searchd.pid

# Source function library.
. /etc/rc.d/init.d/functions

processname=searchd
servicename=sphinx
username=sphinx
sphinxlocation=/usr/local/sphinx
pidfile=$sphinxlocation/var/log/searchd.pid
searchd=$sphinxlocation/bin/searchd

RETVAL=0

PATH=$PATH:$sphinxlocation/bin

start() {
echo -n $”Starting Sphinx daemon: ”
daemon –user=$username –check $servicename $processname
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename
}

stop() {
echo -n $”Stopping Sphinx daemon: ”

$searchd –stop
#killproc -p $pidfile $servicename -TERM
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
rm -f /var/lock/subsys/$servicename
rm -f $pidfile
fi
}

# See how we were called.
case “$1″ in
start)
start
;;
stop)
stop
;;
status)
status $processname
RETVAL=$?
;;
restart)
stop
sleep 3
start
;;
condrestart)
if [ -f /var/lock/subsys/$servicename ]; then
stop
sleep 3
start
fi
;;
*)
echo $”Usage: $0 {start|stop|status|restart|condrestart}”
;;
esac
exit $RETVAL

修改权限并加入到service,机器启动时自动启动

chmod 755 /etc/init.d/sphinx
chkconfig –add sphinx
chkconfig –level 345 sphinx on
chkconfig –list|grep sphinx #检查下


service sphinx start #运行
service sphinx stop #停止,官方的脚本在我的as4上有点问题,所以粗鲁的改了下
service sphinx restart #重启
service sphinx status #查看是否运行

检查下已用sphinx用户运行

ps aux |grep searchd
sphinx 24612 0.0 0.3 11376 6256 pts/1 S 14:07 0:00 searchd

>>猛击这里下载sphinx启动脚本

参考:http://www.sphinxsearch.com/wiki/doku.php?id=for_centos_5
http://www.notsofaqs.com/catsdoc/doku.php?id=sphinx:install

Posted in sphinx, 技术.

Tagged with , , .


使用INSERT INTO … ON DUPLICATE KEY… 批量插入或更新

update和replace没有同时操作多条记录的语句,
可以用insert … on durlicate key…代替,可以同时插入或更新多条记录

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE b=value(b),c=value(c);

如果键a有重复则更新b和c字段,没有则插入

Posted in Mysql, 技术.

Tagged with .


分享Excel做的甘特图(Gantt Chart)

什么是甘特图? 释义
甘特图(Gantt Chart)是一种图形化地概述项目活动及其他相关系统进度情况的水平方向的条状图。 甘特图在项目管理的工作分解结构(Work Breakdown Structure)中有广泛应用,它能够直观地反映项目阶段和牵涉活动。

一幅完整的甘特图由横轴和纵轴两部分组成,横轴表示项目的总时间跨度,并以月、周或日为时间单位;纵轴表示各项目涉及的各项活动; 长短不一的条状图则表示在项目周期内单项活动的完成情况及时间跨度。

简单的甘特图可以由手工绘制,复杂的甘特图可以通过专业软件来完成,如微软的MS Project、Excel等。

符我平时用excel做的甘特图

wbs1

点此下载模板:c1g_schedule.rar

还有一个老外做的:projectmanagementgantt.rar

Posted in 其它, 项目管理.

Tagged with , .


正则表达式Web版助手工具

从网上看到的,一个很强大的web版正则工具.对于学习正则有很大的帮助.

工具地址:

https://regexr.com/

https://regex101.com/

Posted in JavaScript/DOM/XML, 技术.

Tagged with .