搜索引擎中索引的好坏直接影响着搜索引擎的性能,最终影响到用户的体验,可见索引的重要性。
今天我们就来谈谈索引技术。谈到索引大家第一想到的是倒排索引,的确倒排在全文检索中的优势,在搜索引擎中的大量使用令它声名鹊起。所以在此就以倒 排进行分析。但是除了倒排索引外还有很多的索引方式,如静态索引方式有:位图、签名文件、倒排等;动态索引有:B树、B+树等等。
搜索引擎之所以大量使用倒排作为它内部的索引结构,本人觉得主要有两个原因:
1、容易实现、存储简单,更重要的一点是方便进行rank排序,当然还包括倒排列表可以压缩。像位图和签名文件就没有rank排序和压缩的优势。
2、方便查询结果处理,很容易实现布尔计算。现今的主流搜索引擎用的本质计算都属于布尔计算。如要查询包含A和B的文档,其实质是先找出包含A的文档列表,再找出包含B的文档列表,最后把那些既在列表A又在列表B的文档作为结果返回。其实质就是进行一个合取查询操作。
下面就以简单的程序方式来说明到排索引(基于内存的索引)的原理:
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Scanner;
- import java.util.Set;
- import java.util.TreeSet;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class ReverseIndex {
- /**
- * 字典.<术语,倒排列表>
- */
- private static Map<String,Set<Node>> dictionary = new HashMap<String,Set<Node>>();
- private static Pattern extraPattern = Pattern.compile("(//w+)");
- public void addTerm(String term){
- if (term != null) {
- term = term.trim().toLowerCase(); //大小写折叠
- if (! dictionary.containsKey(term)) {
- dictionary.put(term, new TreeSet<Node>());
- }
- }
- }
- //建立倒排列表
- private void index(String term,Integer doc,int f){
- term = term.toLowerCase();
- Set<Node> reverseList = dictionary.get(term);
- if(reverseList !=null){
- reverseList.add(new Node(doc,f));
- }
- }
- /**
- * 这一步其实属于关键词抽取,在搜索引擎中由专门的抽取程序处理。
- * @param txt 要建索引的文档
- * @param doc 文档编号
- */
- public void buildIndex(String txt,Integer doc){
- if(txt == null)
- return;
- Matcher m = extraPattern.matcher(txt);
- Map<String,Integer> map = new HashMap<String, Integer>();
- while(m.find()){
- //算没个词条的频率,准备使用坐标匹配的rank
- String t = m.group(1);
- if(! map.containsKey(t))
- map.put(t, 1);
- else
- map.put(t, map.get(t) + 1);
- }
- for (Map.Entry<String, Integer> entry : map.entrySet()) {
- index(entry.getKey(),doc,entry.getValue());
- }
- }
- /*
- * 对查询结果进行布尔查询中的合取操作
- */
- private Set<Node> mergeResult(List<Set<Node>> queryResult){
- if(queryResult == null || queryResult.size() == 0){
- return new TreeSet<Node>();
- }
- Set<Node> min = null;
- for (Set<Node> set : queryResult) {
- //选择元素最少的查询列表,这样可以减少合取时计算量
- if(min == null){
- min = set;
- }else if(min.size() > set.size()){
- min = set;
- }
- }
- Set<Node> ret = new TreeSet<Node>();
- for (Node n : min) {
- ret.add(n);
- }
- for (Node n : min) {
- for (Set<Node> set : queryResult) {
- if(min == set){
- continue;
- }else if(! set.contains(n)){
- ret.remove(n); //如果在此查询词中不包括文档号,则直接删除此文档
- break;
- }
- }
- }
- return ret;
- }
- /**
- * 查询包含查询术语query的文档
- * @param query
- * @return 文档列表
- */
- public Node[] retrieve(String query){
- if(query ==null)
- return new Node[0];
- query = query.trim().toLowerCase();
- if(query.length() ==0)
- return new Node[0];
- String[] terms = query.split("//s+");
- List<Set<Node>> queryResults = new ArrayList<Set<Node>>();
- for (String t : terms) {
- Set<Node> reverseList = dictionary.get(t);
- if (reverseList != null) {
- queryResults.add(reverseList);
- }
- }
- Set<Node> result = mergeResult(queryResults);
- return result.toArray(new Node[result.size()]);
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- String books = "This distribution includes cryptographic software. The country in /n"
- + "which you currently reside may have restrictions on the import, /n"
- + "possession, use, and/or re-export to another country, of /n"
- + "encryption software. BEFORE using any encryption software, please /n"
- + "check your country's laws, regulations and policies concerning the /n"
- + "import, possession, or use, and re-export of encryption software, to /n"
- + "see if this is permitted. See <http://www.wassenaar.org/> for more /n"
- + "information. /n"
- + "The U.S. Government Department of Commerce, Bureau of Industry and /n"
- + "Security (BIS), has classified this software as Export Commodity /n"
- + "Control Number (ECCN) 5D002.C.1, which includes information security /n"
- + "software using or performing cryptographic functions with asymmetric /n"
- + "algorithms. The form and manner of this Apache Software Foundation /n"
- + "distribution makes it eligible for export under the License Exception /n"
- + "ENC Technology Software Unrestricted (TSU) exception (see the BIS /n"
- + "Export Administration Regulations, Section 740.13) for both object /n"
- + "code and source code. /n"
- + "The following provides more details on the included cryptographic /n"
- + "software: /n"
- + " Hadoop Core uses the SSL libraries from the Jetty project written /n"
- + "by mortbay.org. /n" ;
- /*
- * 要建索引的文档,每一行为一个文档
- */
- String[] docs = books.split("/n");
- //字典文件
- String[] dics = "the provides details Commerce Security Commodity Hadoop libraries TSU laws distribution software country reside import possession".split("//s+");
- ReverseIndex index = new ReverseIndex();
- for (String term : dics) {
- //构建字典
- index.addTerm(term);
- }
- int sno = 0;
- for(String doc:docs){
- //建立索引
- index.buildIndex(doc, sno++);
- }
- System.err.println("please type query words:");
- while(true){
- Scanner in = new Scanner(System.in);
- String query = in.nextLine();
- if("exit".equalsIgnoreCase(query))
- break;
- System.out.println("query:"+query);
- Node[] dosList = index.retrieve(query);
- if(dosList.length ==0 )
- {
- System.out.printf("there are not docs relate to query words '%s'",query);
- continue;
- }
- for(Node dc:dosList){
- System.out.printf("[%d,%d] %s/n", dc.doc, dc.frequency, docs[dc.doc]);
- }
- }
- }
- static class Node implements Comparable<Node>{
- private Integer doc;
- private int frequency;
- @Override
- public int compareTo(Node o) {
- return o.doc - doc ;
- }
- public Node(int doc,int f){
- this.doc = doc;
- this.frequency = f;
- }
- public Integer getDoc() {
- return doc;
- }
- public int getFrequency() {
- return frequency;
- }
- }
- }
说明:
1、索引必须要有一个字典存在,字典就是一些术语的集合.如dog、cat、hotel、beijing .....索引引擎中的字典一般来自公共知识库,商场、娱乐新闻、电影简报等等。
2、索引以索引文件的形式存在磁盘上,在使用的时候加载进内存,或者部分加载进内存,大多数情况下内存不够存放所有的索引,所以有时候索引会进行压 缩存储,字典文件和倒排列表都有相应的压缩方式。如字典中常用的压缩有前缀压缩、最小完美hash、基于磁盘的字典等;到排列表压缩有:一元编码等
3、这里给出的索引方式为基于内存的索引,在索引数据量大时不适用。当然这里把它放在内存是没问题,毕竟才一篇文章,文章的每一行作为一个文档对待。
4、真正的搜索引擎当到索引这一步时所有的数据都已经就绪,关键词的抽取(extract)、术语的权重等等。
相关推荐
根据提供的文件信息,我们可以深入探讨有关Google技术内幕中关于如何使用Sitemap和BlogPing来优化网站在搜索引擎中的表现的关键知识点。 ### Sitemap 和 BlogPing 的重要性 在互联网世界里,确保网站内容能够被...
在SQL Server 7.0中,最重要的提升之一是其查询引擎的改进。它引入了更高效的查询优化器,能够处理复杂的查询并提供更快的执行速度。书中会详细解释如何编写优化的SQL语句,包括使用索引、联接操作和子查询来提高...
- **搜索引擎索引构建**:对网页内容进行抓取、分析和索引,构建高效的搜索索引。 - **数据挖掘**:通过对大量数据集的分析,发现有价值的信息和趋势。 - **机器学习训练**:使用大量数据训练机器学习模型,提高模型...
6. **实战案例**:可能包含若干实际应用场景,如Web日志分析、推荐系统、搜索引擎索引构建等,展示MapReduce在大数据处理中的应用。 7. **高级特性**:如MapReduce v2(YARN上的MapReduce)的改进,包括新的...
MapReduce的应用场景广泛,包括搜索引擎的索引构建、数据分析、日志处理等。然而,它的缺点也很明显,如延迟高、不适合实时计算等。因此,后续出现了许多优化和替代方案,如Spark、Flink等,它们在速度和交互性上...
MapReduce广泛应用于搜索引擎索引构建、推荐系统、日志分析、社交网络分析等领域。例如,通过对用户行为日志的分析,可以挖掘用户兴趣,进行个性化推荐。 10. **未来发展趋势** 虽然Spark等新型计算框架在某些...
- **搜索引擎**:支持搜索引擎中的网页抓取、索引构建和查询处理等功能。 - **社交网络分析**:对社交媒体上的数据进行分析,了解用户行为模式和社会趋势。 #### 七、总结 Hadoop通过其强大的分布式存储和处理能力...
- **B+树**:一种多路搜索树,常用于实现索引,支持高效的数据检索。 #### 数据字典存储 - **数据字典**:用于存储数据库元数据的信息集合,包括表的结构、索引等。 - **存储方式**:数据字典通常采用高效的组织...
手册包含了MySQL的安装与配置、SQL语法、存储引擎、触发器、视图、索引、事务处理、备份与恢复、性能优化等多个方面的内容。对于初学者来说,这份手册是理解和掌握MySQL功能的重要资源,同时对于有经验的开发者来说...
教程将详细对比这些引擎,讲解它们在事务处理、并发控制、全文搜索等方面的功能差异。 六、事务与并发控制 对于需要保证数据一致性的应用,事务处理至关重要。教程会解释ACID属性,以及如何在MySQL中使用BEGIN、...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重剖析应用技巧以帮助...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重剖析应用技巧以帮助...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重剖析应用技巧以帮助...
14110.5.2 多个mongos 14110.5.3 健壮的片 14110.5.4 物理服务器 14210.6 管理分片 14210.6.1 配置集合 14210.6.2 分片命令 143第11 章 应用举例 14511.1 化学品搜索引擎:Java 14511.2 新闻聚合器...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重...
技术内幕 权威必备的参考大全 包含丰富、实用的范例代码 帮助读者熟练掌握微软技术 高级编程 侧重于高级特性、技术和解决问题 包含丰富适用性强的范倒代码 帮助读者精通微软技术 精通&宝典 着重...
14110.5.2 多个mongos 14110.5.3 健壮的片 14110.5.4 物理服务器 14210.6 管理分片 14210.6.1 配置集合 14210.6.2 分片命令 143第11章 应用举例 14511.1 化学品搜索引擎:Java 14511.1.1 安装Java...
2 关于Jive2中的中文搜索 3 基于JAVA的全文索引引擎Lucene简介 <br> 安全认证 1 Jive2.1.1 License保护原理分析 2 用Java的加密机制来保护你的数据 3 在java中编程实现数字签名系统...