文章列表
 
您正在查看 "Lucene" 分类下的文章

2008年07月14日 星期一 11:47

现在,有了一点点想法。

实现一个基于Lucene的搜索引擎,大致设想如下:

数据源:

能够实现对多种格式文件进行建立索引并能够实现检索,这些不同格式的文件主要设定为:HTML、TXT、PDF、Word、Excel这五种格式的文件。

读取数据尽量从已有的数据库中读取,如SQL Server、Oracle、MySQL等数据库,避免频繁的IO操作,造成建立索引的时间开销。

分析器:

灵活可变,可以随时通过后台对分析器进行设置,采用公认的性能较为理想的分析器,对数据进行分

 
2008年06月24日 星期二 23:19

使用Lucene自带的Highlighter就可以实现对原始文件摘要的提取工作。Highlighter类有一个getBestFragment方法,这个方法有多个重载的方法,其中,使用:

public final String getBestFragment(Analyzer analyzer, String fieldName,String text)

就可以提取摘要,它实现了从指定的原始文件中,提取检索关键字出现频率最高的一段文字作为摘要,默认情况下提取100个字符,同时加上自定义的高亮显示代码,又可实现关键字高亮显示。

测试程序如下所示:

package org.shirdrn.lucene.learn.diges

 
2008年06月15日 星期日 23:21
关于Hits类。
这个Hits类可是非常的重要,因为Lucene使用了缓存机制,关于缓存的实现就是在这个Hits类中。Hits工作过程中,使用了LRU算法,即通过一个HitDoc结构来实现一个双向链表,使用LRU置换算法,记录用户最近访问过的Document。
开门见山,直接拿出Hits类的实现代码来说话。
package org.apache.lucene.search;
import java.io.IOException;
import java.util.Vector;
import java.util.Iterator;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptInde
 
2008年06月14日 星期六 22:46

当执行Hits htis = search(query);这一行代码的时候,到底中间经过了怎样的过程,最终使得我们获取到了含有检索结果的集合Hits hits呢?

这里,以最简单的检索为例,追踪并理解Lucene(2.2.0版本)获取到检索结果的过程。

1、IndexSearcher继承自Searcher类的最简单的search方法,如下所示:

public final Hits search(Query query) throws IOException {
    return search(query, (Filter)null);
}

 
2008年06月11日 星期三 22:02

来源:互联网

Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:
  
  0)设有两篇文章1和2
  文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
  文章2的内容为:He once lived in Shanghai.
  
  1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
  a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所

 
2008年06月11日 星期三 15:23

Lucene 2.2.0发行包中自带的org.apache.lucene.demo包中,有一个为HTML和TXT文件建立索引、删除索引以及实现检索的实例,其中在org.apache.lucene.demo.html包中的一些类,是真正解析HTML文件的工具类,包括解析类、预定义类、异常处理类。

这个例子的命令提示为:

IndexHTML [-create] [-index <index>] <root_directory>

是建关于索引的命令,-create是建立索引,-index是选择删除指定的索引文件。

这个例子运行过程如下所示。

将相关jar包luene-core-2.2.0.jar和lucene-demos

 
2008年05月14日 星期三 16:43

在Lucene的org.apache.lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。使用百度、Google搜索的时候,检索结果显示的时候,在摘要中实现与关键字相同的词条进行高亮显示,百度和Google指定红色高亮显示。

有了Lucene提供的高亮显示的工具,可以很方便地实现高亮显示的功能。

高亮显示,就是根据用户输入的检索关键字,检索找到该关键字对应的检索结果文件,提取对应于该文件的摘要文本,然后根据设置的高亮格式,将格式写入到摘要文本中对应的与关键字相同或相似的词条上,在网页上显示出来,该

 
2008年05月08日 星期四 21:21

关于Lucene检索结果的排序问题。

已经知道,Lucene的默认排序是按照Document的得分进行排序的。当检索结果集中的两个Document的具有相同的得分时,默认按照Document的ID对结果进行排序。

下面研究几种设置/改变检索结果排序的方法。

改变Document的boost(激励因子)

改变boost的值实现改变检索结果集的排序,是最简单的方法,只需要在建立索引的过程中,设置指定的Document的boost值,来改变排序结果中Document位置的提前或者靠后。

根据在文章

 
2008年04月28日 星期一 11:53

关于Lucene得分的计算。

在IndexSearcher类中有一个管理Lucene得分情况的方法,如下所示:

public Explanation explain(Weight weight, int doc) throws IOException {
    return weight.explain(reader, doc);
}

返回的这个Explanation的实例解释了Lucene中Document的得分情况。我们可以测试一下,直观地感觉一下到底这个Explanation的实例都记录了一个Document的哪些信息。

写一个测试类,如下所示:

package org.shirdrn.lucene.learn;

import java.io.I

 
2008年04月24日 星期四 22:58

关于QueryParser。

QueryParser是用来解析用户输入的查询的,将用户的输入的短语进行分析,从而提交Query查询来实现检索。

QueryParser一共有三个构造方法,我们通过使用如下的构造方法:

public QueryParser(String f, Analyzer a) {
    this(new FastCharStream(new StringReader("")));
    analyzer = a;
    field = f;
}

指定一个检索的关键字(String类型)和一个分析器。

当然,要使得:建立索引所使用的

 
2008年04月23日 星期三 22:03

关于MultiTermQuery查询。

这里研究继承自MultiTermQuery的WildcardQuery查询。

WildcardQuery查询,就是使用通配符进行查询,通配符可以使用“*”和“?”这两种:“*”可以代表0~N个字符串,“?”只能代表一个字符串,而且它们可以在一个词条Term的任何位置出现,从WildcardQuery的构造方法中可以看出:

public WildcardQuery(Term term) {
    super(term);
    this.termContainsWildcard = (term.text().indexOf('

 
2008年04月23日 星期三 18:49

关于MultiTermQuery查询。

这里研究FuzzyQuery查询。

MultiTermQuery是一个抽象类,继承自它的一种有3个,分别为:FuzzyQuery、WildcardQuery、RegexQuery,其中RegexQuery使用了第三方提供的服务,可以使用正则表达式,如果你对正则表达式很熟悉,可以尝试着使用RegexQuery查询。

FuzzyQuery查询,即模糊查询。

在FuzzyQuery类定义中定义了两个成员变量:

private float minimumSimilarity;
private int prefixLength;

minimumSimilarity是最小相似度,取值范围为0.0~1.0,包含0

 
2008年04月23日 星期三 15:26

关于MultiPhraseQuery(多短语查询)。

MultiPhraseQuery可以通过多个短语的拼接来实现复杂查询。

举个例子:现在使用StandardAnalyzer分析器建立索引,索引中是将单个的汉字作为一个一个地词条。使用这个分析器,因为没有像“今天”这样两个汉字组成词条,所以要想单独按照索引中的词条进行检索是不可能查询出任何结果的。

当然,有很多方案可以选择,其中MultiPhraseQuery就能够实现:

它可以指定一个前缀,比如“今”,而后缀是一个Term[]数组,可以是{new Term("年

 
2008年04月21日 星期一 22:54

关于PhraseQuery。

PhraseQuery查询是将多个短语进行合并,得到一个新的词条,从索引库中检索出这个复杂的词条所对应的目标数据文件。

举个例子:假如用户输入关键字“网络安全”,如果索引库中没有单独的“网络安全”这个词条,但是具有“网络”和“安全”这两个词条,我们可以使用PhraseQuery进行查询,将“网络”和“安全”这两个词条合并后能够检索出匹配“网络安全”的所有词条对应的结果集。

现在,使用StandardAnalyzer分析

 
2008年04月20日 星期日 18:18

关于范围查询RangeQuery。

RangeQuery是由两个词条作为上界和下界进行查询,同时指定了一个Boolean型参数,表示是否包括边界,这可以从
RangeQuery的构造方法看到:

    public RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive)
    {
        if (lowerTerm == null && upperTerm == null)
        {
        

 
   
 
 
文章存档
 
     
 
最新文章评论
  

这个不错,很详细,对于我们初学spring框架的人不错的帮助,感谢楼主分享
 

最近用,学习了~
 

[表情]
 

[表情]
 

对于Ubuntu用户,有一个简单的办法: 将该用户添加到admin用户组,即 usermod -G adm
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu