当前位置:首页 > Windows程序 > 正文

sphinx在c#.net平台下使用(一)

2021-03-24 Windows程序

Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个可以结合MySQL,PostgreSQL全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。是做站内全文搜索的一把利器。

sphinx已经出现很多年,并不是一个新鲜技术,但如今仍被广泛使用者。但由于IT技术的不断创新,在圈子中又出现了几款用于全文检索的新技术,如lucene就是一款与之媲美的工具,但相对而言,它的建立索引的速度却远远不如sphinx。次文不介绍sphinx的如何优越,主要介绍一下我在使用sphinx是的一些心得笔记,勿拍砖,希望给大家一个参考。

sphinx拥有丰富的学习材料, 这文档拥有详细的sphinx安装步骤。

本次使用操作系统为centos6.5,sphinx2.2版本。

Sphinx在mysql上的应用有两种方式:(下面这一段是摘抄的,勿拍砖)
①、采用API调用,如使用PHP、java等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;
缺点是如已有搜索程序的条件下,需修改部分程序。推荐程序员使用。


②、使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端。不必二次查询(注),在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM。另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储。

系统管理员可使用这种方式sphinx在检索到结果后只能返回记录的ID,而非要查的sql数据,故需要重新根据这些ID再次从数据库中查询。

红色这段话是学习sphinx最为重要信息。通常为了快速开发,或者为了对已有项目进行优化,只能使用第一种方案。第二种插件方式,对于如今orm框架盛行的今天,可能选择的人会很少,对于我们.net程序员,更不会考虑。

那我们先看看Sphinx第一种方式的实现,第一种方式配置比较简单,根据中文手册可顺利配置完成,重点是配置完成的sphinx,在.net下我们该如何使用:

(1)sphinx connector.net

sphinx官网本身不支持c#.net的API这让我们改怎么活。不过后来伟大的人出现了,相继出现了sphinx connector.net为我们提供了连接sphinx服务器的接口,而且跟linq语法紧密结合,,真的很不错,但是。。。它是付费的,不然搜索出的记录最多只能有5条。我们.net程序员本来工资就不高,放弃,继续寻找免费的大萝卜。。。。

(2)sphinx.client

网上还是有大牛仿照php的api源码,写出了sphinxClient的.net类库,调调就能用。站在巨人的肩膀上吹风,凉快。。。。

Sphinx在mysql中的使用,无非是为数据库各个字段提供更为快速的索引库,当mysql出现巨量数据的时候能够提供更为快速的秒搜能力,如果你还用传统sql like。。。。结果可想而知。

sphinx本身不支持中文字体的搜索,如果想实现中文的搜索必须使用字符表,或者实现中文分词

(1)字符表,sphinx会对中文进行单字切分,进行字索引,速度慢点

字符表的实现很简单 已经实现。

(2)中文分词,使用分词插件如 coreseek,sfc,它里面有很好的算法,速度现对好点

coreseek至今还在不断更新,已经到了4版本,推荐使用,可参考资料: 很详细,真好

当服务器配置完成后我们创建.net解决方案,实现sphinx服务器的通信;

using System; namespace phinxDemo { class Program { static void Main(string[] args) { SphinxClient sphinxClient = new SphinxClient("192.168.233.129", 9312); Console.WriteLine("请输入操作模式:[a]查询,[b]插入新数据,[c]删除数据"); string inputstr = Console.ReadLine(); while (true) { switch (inputstr) { case "a": //查询数据 Console.WriteLine("---------------查询数据---------------------"); Console.WriteLine("请输入匹配的字符串"); QueryData(Console.ReadLine(), sphinxClient); break; case "b": //插入数据 Console.WriteLine("---------------插入数据---------------------"); Console.WriteLine("请输入要插入的字符串"); break; case "c": //删除数据 Console.WriteLine("---------------删除数据---------------------"); Console.WriteLine("请输入要删除的字符串"); break; } } } private static void QueryData(string p, SphinxClient sphinxClient) { var sphinxSearchResult = sphinxClient.Query(p); Console.WriteLine("此查询在服务器检索所得的匹配文档总数:{0}", sphinxSearchResult.total); Console.WriteLine("索引中匹配文档的总数:{0}", sphinxSearchResult.totalFound); Console.WriteLine("将查询关键字映射到一个包含关于关键字的统计数据的小hash表上:{0}", sphinxSearchResult.totalFound); Console.WriteLine("searchd报告的错误信息:{0}", sphinxSearchResult.error); Console.WriteLine("searchd报告的警告信息:{0}", sphinxSearchResult.warning); foreach (SphinxMatch match in sphinxSearchResult.matches) { Console.WriteLine("DocumentId {0} Weight {1}", match.docId, match.weight); } Console.ReadLine(); } } }

  提供大牛的sphinxClient

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66704.html