• 1. 全文检索及Lucence
  • 2.   全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。
  • 3. 一、全文检索现状 目前常见全文检索技术: 1. 百度、谷哥等专业搜索引擎系统。 2. 数据库类型的全文检索。 3. java以Lucence为代表的全文检索系统。 4. php以Sphinx为代表的全文检索系统。 5. 以TRS为代表其他语言及商业全文检索系统。
  • 4. 专业搜索引擎 专业搜索引擎提供了大众化的全网的内容搜索。 优点:使用免费,搜索便捷。 缺点:过于大众化,很多专业数据被淹没在信息的海洋之中,不便于与应用系统相结合。
  • 5. 数据库类型全文检索 大多数主流数据都提供全文检索功能,如Oracle、Mysql、SqlServer等。 优点:和数据库整合到一块,不需要独立建立系统,方便管理,使用方便。 缺点:扩展不便,索引和查询都不够灵活方便,会影响数据库运行性能。
  • 6. Lucence开源搜索引擎核心 确切的讲,Lucence不是完整的搜索引擎,它只是一个开发包。 优点:自定义索引格式,容易部署,方便扩展,提供丰富强大的查询实现,可以对任一可以影响到结果的功能进行定制。 缺点:还未产品化,还存在着一些特定场合的问题。
  • 7. Sphinx一种可以和Mysql配合使用的全文检索系统 优点:高速、海量,算法优秀,支持分布式,功能、接口丰富,发行版本支持多平台。 缺点:有待学习接触。
  • 8. Lucence简介基于 Java 的全文信息检索工具包 Lucene 目前是 Apache Jakarta 家族中的一个开源项目,下载http://lucene.apache.org/ 基于Java编写,并有.NET同构产品以及其他语言实现。
  • 9. Lucence突出优点(1)索引文件格式独立于应用平台。 (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引 (3)优秀的面向对象的系统架构 (4)设计了独立于语言和文件格式的文本分析接口 (5)已经默认实现了一套强大的查询引擎
  • 10. 数据分类结构化数据:具有固定格式或者有限长度的数据如数据库、元数据等。 非结构化数据:指不固定长度或者不固定格式的数据如邮件、word文档等。 非结构化数据的另一种叫法全文数据。
  • 11. 搜索分类结构化数据搜索:用sql对数据库搜索,利用操作系统命令对文件类型的元数据按照文件大小、扩展名、修改时间等属性进行搜索等。 对非结构化数据搜索:如操作系统进行文件内容关键词的检索;再如用google百度进行的海量信息检索。
  • 12. 非结构化信息的检索 顺序扫描法: 特点:方便、简单、速度慢。 先索引再进行搜索法: 特点:需要先进行索引才能进行查找,查找速度快。又 称全文检索。
  • 13. (本页无文本内容)
  • 14. 全文检索全文检索大致分为两个部分:索引创建、搜索索引。 于是全文检索就存在如下三个问题: 1、索引里存着什么? 2、如何创建索引? 3、如何进行索引搜索?
  • 15. 索引链表反向索引结构图
  • 16. 通过合并链表查出既包含Lucence又包含Solr的文件
  • 17. 索引过程组织文档 将原始文档进行分词处理 (Tokenizer)得到词元(Token) 语言组件处理(变为小写、复数变单数、动词变原型) 将得到的词Term传递给索引组件: 1.利用所得到的Term创建一个字典 2.对字典进行字母排序 3.合并相同词Term成为文档倒排(Posting List)链表。
  • 18. 倒排文档链表Posting List
  • 19. 查询索引过程用户输入查询语句 对查询语句进行词法分析语法分析及语言处理 词法:单词和关键字 语法分析:根据与语法规则形成语法树 语言处理:和索引过程几乎相同 搜索索引得到符合语法树的文档 得到查询语句的相关性对结果排序
  • 20. Lucence and learned not Hadoop语法树
  • 21. 处理过的语法树
  • 22. 相关性与分值
  • 23. (本页无文本内容)
  • 24. (本页无文本内容)
  • 25. (本页无文本内容)
  • 26. (本页无文本内容)
  • 27. Lucence软件架构① 查询②访问 ③索引存储 索引④内存 存储 ⑤文件系统⑥ 分析⑦ 语料库用户界面图例实现协议
  • 28. Lucence API 介绍org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util 一些公用的数据结构
  • 29. Lucene应用实例以搜索文本文档(*.txt)为例 假定指定目录没有子目录
  • 30. 文档索引代码File indexDir = new File(“D:\\luceneIndex”); //此目录用于存储生成的索引 File dataDir = new File(“D:\\luceneData”); //需要建立索引的目录(假定其没有子目录) Analyzer luceneAnalyzer = new CJKAnalyzer();//中日韩词法分析 IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,true); File[] dataFiles = dataDir.listFiles(); for (File currentFile : dataFiles) { if (currentFile .isFile() && currentFile .getName().endsWith(".txt")) { Document document = new Document(); Reader txtReader = new FileReader(currentFile ); document.add(Field.Text("path", currentFile .getCanonicalPath())); document.add(Field.Text("contents", txtReader)); indexWriter.addDocument(document); } } indexWriter.optimize(); indexWriter.close();
  • 31. 文档查询代码String queryStr = “which you want"; File indexDir = new File("D:\\luceneIndex"); if(!indexDir.exists()){ System.out.println("The Lucene index is not exist"); return; } FSDirectory directory = FSDirectory.getDirectory(indexDir,false); IndexSearcher searcher = new IndexSearcher(directory); Term term = new Term("contents",queryStr.toLowerCase()); TermQuery luceneQuery = new TermQuery(term); Hits hits = searcher.search(luceneQuery); for(int i = 0; i < hits.length(); i++){ Document document = hits.doc(i); System.out.println("File: " + document.get("path")); }
  • 32. 全文检索常见问题文档域的存储设置 分词分析器个性化实现 文档检索高亮显示查询过程 查询分页、排序 索引建立过程异常处理 部分搜索结果搜索不到 索引内容的删除、更新
  • 33. 全文检索常见问题中文分词处理 文章相关内容计算法 分布式全文检索 不能及时更新索引时与数据库内容一致方法 高级查询:通配符、模糊、间距查询、范围查询、权重查询、组合条件、转义字符
  • 34. 英文检索:单词缩为词根形式 steamming lemmatization 两个过程需要建立对应的分词器 Linux Window 平台差异 Nutch 不同版本的Lucene之间API有较大差异 是否要转向Sphinx 全文检索常见问题