摘要:BF(Bruce Force)算法可以说是模式匹配算法中最简单、最容易理解的一个。原理很简单。其基本思想是从主串的start位置开始与模式串进行匹配,如果相等,则继续比较后续字符,如果不相等则模式串回溯到开始位置,主串回溯到start+1位置,继续进行比较直至模式串的所有字符都已比较成功则匹配成功,或者主串所有的字符已经比较完毕,没有找到完全匹配的字串,则匹配失败。package com.fox;/** * @author huangfox * @data 2012-7-18 * @email huangfox009@126.com * @desc */public class BF { /.
阅读全文
07 2012 档案
摘要:一)单词-文档矩阵通常检索的场景是:给定几个关键词,找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词-文档矩阵模型,通过这个模型我们可以很方便知道某篇文档包含哪些单词,某个单词被哪些文档所包含。搜索引擎的索引其实就是实现单词-文档矩阵的具体数据结构,具体可以包括:倒排索引、签名文件、后缀树等。常见的当然就是倒排索引了,lucene也是基于倒排索引实现的。二)倒排索引1.倒排索引的组成倒排索引通常有词汇表和记录表组成。词汇表:文档集合中所包含的不同单词的集合。记录表:对于词汇表中的每一个单词,包含这个单词的文档编号构成的一个列表(有可能还会保存些其他信息,
阅读全文
摘要:lucene的打分需要用到优先级队列,他是基于“堆”实现的。PriorityQueue是一个抽象方法,要求子类实现一个“比较方法”!PriorityQueue的源码如下:package org.apache.lucene.util;/** * Copyright 2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with
阅读全文
摘要:对于lucene的统计,我基本放弃使用factedSearch了,效率不高,而且两套索引总觉得有点臃肿!这次我们通过改造Collector,实现简单的统计功能。经过测试,对几十万的统计还是比较快的。首先我们简单理解下Collector在search中的使用情况!Collector是一个接口,主要包括以下重要方法:public abstract class Collector { //指定打分器 public abstract void setScorer(Scorer scorer) throws IOException; //对目标结果进行收集,很重要! public abstrac...
阅读全文
摘要:HashMap以<key,value>的方式存放数据,存储在数组中。通过开散列方法解决冲突,数组中存放的Entry作为单向链表的表头。Entry的源码如下:static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; //构造、get、set等方法省略 public final boolean equals(Object o) { if (...
阅读全文
摘要:一)散列的基本概念散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中。检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点。通过散列方法可以对结点进行快速检索。散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法。按散列存储方式构造的存储结构称为散列表(hash table)。散列表中的一个位置称为槽(slot)。散列技术的核心是散列函数(hash function)。对任意给定的动态查找表DL,如果选定了某个“理想
阅读全文
摘要:MoreLikeThis,相似检索。找出某篇文档的相似文档,常见于“类似新闻”、“相关文章”等,这里完全是基于内容的分析。1)MoreLikeThis的使用 FSDirectory directory = SimpleFSDirectory.open(new File("d:/nrtTest2")); IndexReader reader = IndexReader.open(directory); IndexSearcher searcher = new IndexSearcher(reader); // MoreLikeThis mlt = new ...
阅读全文
摘要:这里讨论list、set、map的排序,包括按照map的value进行排序。1)list排序list排序可以直接采用Collections的sort方法,也可以使用Arrays的sort方法,归根结底Collections就是调用Arrays的sort方法。public static void sort(List list, Comparator c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j { pri.
阅读全文
摘要:最近两天重新梳理了下lucene的打分算法,是基于1.9版本的(原理一致那么就选个简单的版本来看看,看着也简单利落)。编辑那些公式什么的也繁琐,就直接贴草稿图吧,偷个懒!1)打分公式公式的2、4、5部分只是和query相关,这部分计算在weight中完成!!!2)构建weight一下都是对termQuery进行分析,这里构建的也是TermWeight。weight的属性value为上述公式2、4、5部分的乘积,及query的权重。打分的过程本来就是query的权重和命中document权重的运算,这里先计算出query的权重,后面的时候交给score完成。这相当于是一个准备的工作!3)构建sc
阅读全文