《搜索引擎解密(精品).ppt》由会员分享,可在线阅读,更多相关《搜索引擎解密(精品).ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、搜索引擎解密搜索引擎解密猎兔搜索猎兔搜索罗刚罗刚搜索引擎结构搜索引擎结构文档文本提取索引程序索引库(Lucene)搜索查询服务器(Solr)文件数据库爬虫NBA搜索Lucene是什么是什么包括全文索引库简单的语言解析功能不包括爬虫文档格式解析“PageRank”等排序算法Lucene来源与发展来源与发展1999 Cutting 开发的第一个Java程序2001 捐赠给Apache2004年11月 1.4.3版本2008年10月 2.4.0版本2009年11月 3.0.0版本Lucene的用户的用户国际TwitterIBMLinkedIn 捐出分类统计的子项目bobo-browse和实时搜索的项
2、目Zoie国内凤凰网敦煌网豆丁人工编的名词人工编的名词索引索引-方便查找方便查找全文索引结构全文索引结构12435词:词:文档文档:北京武汉天津上海大连Lucene中的倒排索引中的倒排索引索引相关类索引相关类DocumentAnalyzerIndexWriterField(Title)通过IndexWriter来写索引,通过IndexReader读索引。一段有意义的文字需要通过Analyzer分割成一个个词语后才能按关键词搜索。Analyzer就是分析器,StandardAnalyzer是Lucene中最常用的分析器。TokenStream实例保存着当前的Attribute状态。Attribu
3、te 是一个接口,实现中包含一个代表词本身含义的字符串和该词在文章中相应的起止偏移位置,Attribute还可以用来存储词类型或语义信息。一个Document代表索引库中的一条记录。要搜索的信息封装成Document后通过IndexWriter写入索引库。调用Searcher接口按关键词搜索后,返回的也是一个封装后的Document的列表。一个Document可以包含多个列,叫做field。例如一篇文章可以包含“标题”、“正文”、“修改时间”等field,创建这些列对象以后,可以通过Document的add方法增加这些列。Field(Body)Field(URL)AnalyzerAnalyze
4、r analyzer=new StandardAnalyzer();/or any other analyzerTokenStream ts=analyzer.tokenStream(myfield,new StringReader(some text goes here);while(ts.incrementToken()System.out.println(token:+ts);创建索引创建索引/创建新的索引或者对已有的索引增加文档index=new IndexWriter(indexDirectory,new StandardAnalyzer(Version.LUCENE_CURRENT
5、),!incremental,IndexWriter.MaxFieldLength.UNLIMITED);File dir=new File(sSourceDir);indexDir(dir);/索引路径 index.optimize();/索引优化 index.close();/关闭索引库向索引增加文档向索引增加文档Document doc=new Document();/创建网址列Field f=new Field(url,news.URL,Field.Store.YES,Field.Index.NOT_ANALYZED,/不分词 Field.TermVector.NO);doc.add(
6、f);/创建标题列f=new Field(title,news.title,Field.Store.YES,Field.Index.ANALYZED,/分词 Field.TermVector.WITH_POSITIONS_OFFSETS);/存Token位置信息doc.add(f);/创建内容列f=new Field(body,news.body,Field.Store.YES,Field.Index.ANALYZED,/分词 Field.TermVector.WITH_POSITIONS_OFFSETS);/存Token位置信息doc.add(f);index.addDocument(doc
7、);搜索搜索/read-only=trueIndexSearcher isearcher=new IndexSearcher(directory,true);/Parse a simple query that searches for text:QueryParser parser=new QueryParser(Version.LUCENE_CURRENT,fieldname,analyzer);Query query=parser.parse(text);/返回前1000条搜索结果ScoreDoc hits=isearcher.search(query,1000).scoreDocs;/
8、遍历结果for(int i=0;i hits.length;i+)Document hitDoc=isearcher.doc(hitsi.doc);System.out.println(hitDoc.get(fieldname);isearcher.close();directory.close();常用查询常用查询Query说明用法TermQuery最基本的词条查询查询不切分的字段或者基本词BooleanQuery布尔逻辑查询组合条件查询PhraseQuery短语匹配查询要求精确匹配的查询SpanQuery匹配位置相关的查询(跨度查询)字词混合查询FieldScoreQuery函数查询(通过
9、数字型的字段影响排序结果)时间加权排序区间查询区间查询查询语法:time:2007-08-13T00:00:00Z TO 2008-08-13T00:00:00Z 调用代码:ConstantScoreRangeQuery dateQuery=new ConstantScoreRangeQuery(time,t1,t2,true,true);2.9以前版本区间查询的问题以前版本区间查询的问题 RangeQuery采用扩展成TermQuery来实现,如果查询区间范围太大,RangeQuery会导致TooManyClausesExceptionConstantScoreRangeQuery 内部采用
10、Filter来实现,当索引很大的时候,查询速度会很慢Trie结构实现的区间查询结构实现的区间查询Range4424442142344552144844652263526564632633644642641在Lucene2.9以后的版本中,用Trie结构索引日期和数字等类型。例如:把521 这个整数索引成为:百位是5、十位是52、个位是521。这样重复索引的好处是可以用最低的精度搜索匹配区域的中心地带,用较高的精度匹配边界。这样减少了要搜索的Term数量。Trie结构区间查询结构区间查询例如:TrieRange:423 TO 642分解为5个子条件来执行:handreds:5 OR tens:4
11、3 TO 49 OR ones:423 TO 429 OR tens:60 TO 63 OR ones:640 TO 642查询语法查询语法加权 solr4 lucene修饰符 +-NOT +solr lucene 布尔操作符 OR AND (solr OR lucene)AND user按域查询 title:NBAQueryParserQueryParser将输入查询字串解析为Lucene Query对象。QueryParser是使用JavaCC(Java Compiler Compiler)工具生成的词法解析器。QueryParser.jj中定义了查询语法。需要让QueryParser更好
12、的支持中文,例如全角空格等?Filter可以定义Filter类来过滤查询结果。也可以缓存和重用Filter。如下条件可用Filter来实现:根据不同的安全权限显示搜索结果;仅查看上个月的数据;在某个类别中查找。BestDriversFilterBestDriversFilter 把结果限定到score 是5 的司机。public class BestDriversFilter extends FilterOverride public DocIdSet getDocIdSet(IndexReader reader)throws IOException OpenBitSet bitSet=new
13、 OpenBitSet(reader.maxDoc();TermDocs termDocs=reader.termDocs(new Term(score,5);while(termDocs.next()bitSet.set(termDocs.doc();return bitSet;使用使用FilterFilter bestDriversFilter=new BestDriversFilter();/query不变,增加bestDriversFilterScoreDoc hits=isearcher.search(query,bestDriversFilter,1000).scoreDocs;/
14、返回的结果可能比以前少了分类统计分类统计(FacetedSearch)Filter实现的分类统计实现的分类统计 String cats=001004003,001008003021,001004014;/类别数组long catCounts=new longcats.length;/分类统计结果/原始查询Filter all=new QueryWrapperFilter(q);/用AND逻辑合并FilterChainedFilter.DEFAULT=ChainedFilter.AND;for(int i=0;icats.length;+i)/分类统计查询条件 Filter these=new
15、QueryWrapperFilter(new TermQuery(new Term(cat,catsi);ChainedFilter chainedFilter=new ChainedFilter(new Filterall,these);/取得Filter中的BitSet的1 的个数 catCountsi=chainedFilter.getCardinality(reader);return catCounts;SolrvsSphinxSphinx速度很快,但是不支持索引速度很快,但是不支持索引复制和分发。有单点失败的问题复制和分发。有单点失败的问题Sphinx不支持搜索结果的高亮显示不支持
16、搜索结果的高亮显示Sphinx没有对搜索结果的缓存没有对搜索结果的缓存个人结论:Sphinx功能简单,速度功能简单,速度快,快,Solr速度慢点,但功能更全。速度慢点,但功能更全。Solr起源起源LuceneLucene仅仅是一个全文检索包,不仅仅是一个全文检索包,不是一个独立的搜索服务是一个独立的搜索服务SolrSolr来源于来源于CNET.comCNET.com的内部数据库的内部数据库检索项目检索项目Solr的含义是:的含义是:SearchingOnLucenew/ReplicationSolr当前主要主要代码维护者当前主要主要代码维护者Yonik斯坦福大学硕士毕业斯坦福大学硕士毕业Sol
17、r发展过程发展过程2004秋天秋天,CNET启动启动Solr项目的前生项目的前生Solar2005夏天,夏天,CNET产品目录搜索开始产品目录搜索开始使用使用Solar2006年年1月捐赠给月捐赠给Apache2007年年1月月Solr毕业成为毕业成为Lucene的子的子项目并发布项目并发布1.2版本版本2008年年9月月发布发布 1.3.0版本版本2009年年11月月发布发布1.4版本版本Solr用户用户国际国际AOLCNETDisneyApple,Inc.国内国内阿里巴巴阿里巴巴安居客安居客新聚思新聚思(SYNNEX)Solr搜索服务器的特点搜索服务器的特点是Web Server中的Ser
18、vlet积极的缓存(自动加载搜索热词等)Web管理界面XML/HTTP,JSON 接口Faceting(分类统计搜索结果)通过Schema配置文件定义types 和 fields为了并发访问,实现主从式的索引复制使用使用Solr搜索服务器搜索服务器JavaJava客户端客户端-SolrJ-SolrJ通过通过Java Java 二进制格式快速返回结果二进制格式快速返回结果.Net.Net客户端客户端-SolrSharp-SolrSharpPHPPHP客户端客户端-“solr-php-clientsolr-php-client”Schema.xml Schema.xml指定id为唯一列id指定bo
19、dy为默认搜索列。bodysolrconfig.xml用来配置solr运行的系统参数,例如缓存,插件等。预热搜索数量最好少于CPU核数量4增加数据HTTP POST to http:/localhost:8983/solr/update/05991BridgewaterPerlJava.更新/删除数据更新若增加文档的主键已经存在索引库中,则替换已有的。删除通过主键删除 05991通过查询删除 name:AnthonySolr的后台管理界面SolrSolr后台查询实例后台查询实例查询(Query),根据查询条件可以得到查询结果,例如*:*查询条件查询结果数查询用时Search基本参数qt 查询类型(request handler),例如 standard wt 返回格式类型(response writer),例如xml或json公共参数q 查询词 sort 排序方式start -返回结果的开始行rows -本次需要返回结果的行数fl 需要返回的列名称Faceted Searchhttp:/localhost:8983/solr/select?q=ipod&rows=0&facet=true&facet.limit=-1&facet.field=cat&facet.mincount=1&facet.field=inStock0312331搜索界面检索案例http:/
限制150内