<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>四季如風 &#187; Lucene</title>
	<atom:link href="http://www.hjide.com/tag/lucene/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hjide.com</link>
	<description>每一天我們都在進步</description>
	<lastBuildDate>Fri, 03 Feb 2012 06:26:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>用Lucene实现在检索结果中再检索</title>
		<link>http://www.hjide.com/article/239.htm</link>
		<comments>http://www.hjide.com/article/239.htm#comments</comments>
		<pubDate>Tue, 29 Jan 2008 08:37:45 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=239</guid>
		<description><![CDATA[Lucene是可以做到的，利用lucene的Filter，具体可以查看lucene的api中的org.apache.lucene.search.CachingWrapperFilter，它可以缓存上次的搜索结果，从而实现在结果中的搜索。测试实例：package com.wsjava;import java.io.IOException;import org.apache.lucene.analysis.SimpleAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.queryParser.ParseException;import org.apache.lucene.queryParser.QueryParser;import org.apache.lucene.search.CachingWrapperFilter;import org.apache.lucene.search.Filter;import org.apache.lucene.search.Hits;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.Query;import org.apache.lucene.search.QueryFilter;public class IndexTest {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/**&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * @param args&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * @throws ParseException &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * @throws IOException &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public static void main(String[] args) throws IOException, ParseException {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;index();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;search(“day”); //简单搜索&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchInResult(“day”, “you”); //在结果集中搜索&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public static void index() throws IOException {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IndexWriter writer = new IndexWriter(“d:/tesindex”,new SimpleAnalyzer(), true);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;writer.setMaxMergeDocs(1000);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;writer.setMergeFactor(100);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (int i [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/239.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何把lucene索引放在内存中提供查询服务</title>
		<link>http://www.hjide.com/article/237.htm</link>
		<comments>http://www.hjide.com/article/237.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:29:43 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=237</guid>
		<description><![CDATA[200W以下的数据量全部加载到内存最简单的方式是修改Lucene（1.9版本）源码 org.apache.lucene.index.IndexReader文件的第127行 将return open(FSDirectory.getDirectory(path, false), true);修改为return open(new RAMDirectory(FSDirectory.getDirectory(path, false)), true);将133行的 return open(FSDirectory.getDirectory(path, false), true);修改为return open(new RAMDirectory( FSDirectory.getDirectory(path, false)), true);这样就可以在查询的时候将所有索引一次加载到内存，查询响应时间即使是第一次查询，也会小于0.1秒，但仅适用于索引文档数量不超过200W个，并且平均的页面大小不超过10K，文献检索系统 ，这种方式尤其适合。创建索引的时候也能够使用 RAMDirectory ， 比FSDirectory 要快很多 。令一种方法：FSDirectory directory = FSDirectory.getDirectory(args[0], false);&#160;&#160; 1RAMDirectory directory = new RAMDirectory(args[0]);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2用2代替1即可]]></description>
		<wfw:commentRss>http://www.hjide.com/article/237.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inside Lucene/超人气搜索引擎学习</title>
		<link>http://www.hjide.com/article/236.htm</link>
		<comments>http://www.hjide.com/article/236.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:27:49 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=236</guid>
		<description><![CDATA[转：http://www.lucene.org.cn/read.php?tid=65建立索引->应答搜索请求>无 论有多少精彩的应用, 这个印刷时代就诞生的公式都不会作废, 公式中最关键的成分是 1. 数据, 2.算法. 虽然二者中谁对结果质量更重要依然引起争论, 我的精力并未放在这两者上. 关于spider已有数本出名的专著, 算法原理的本质也早不是秘密, 这是搜索引擎必备的条件, 是基础设备而不是制胜的杀手锏. 面对一个活生生的搜索引擎, 研究这两者就像面对解剖台上的小白鼠, 却放下手术刀去查上课用的内脏图解. 我只注意实现, 实现是商业效率的体现, 这才是真刀真枪狼烟四起的地方.抛开数据采集, 上边的周期分成两个相(phase), 1. Indexing(建立索引), 2.Searching(搜索). 还有一个现在看来显得古怪的词-检索, 图书馆系统大多用这个词. 中国人的词汇总是显得睿智, “索”本有求取寻找的意思, “索引”原本就是为搜索创造的. 那些题目是”倒排索引原理”大篇幅对索引和模式匹配进行比较的文章, 因此有些让人哭笑不得. 上述的两个phase正是lucene覆盖的范围(Lucene核心不提供crawler), 这两个phase一个用于生成索引(index), 一个用于从index取出数据, 可以看出Lucene的一切行为都和index有关. 幸好Lucene官方指南 Lucene in Action 在附录中用浅显的语言介绍了index的结构, 这让人了解Lucene怎么把一片片文档塞进去, 就像绞肉机把一片片五花肉里脊肉搅成肉酱. 但是有点遗憾的感觉: 搜索过程怎么把index中支离破碎的数据记录(index的结构用法着实很像数据库)恢复成检索结果? 就像主妇们怎么用屠夫的肉酱作出香喷喷的肉丸?我从Query 的构造开始, 详细检验了Lucene处理Query的过程. 这种努力使我了解到index中的记录(就是数据库中的record概念), 如何在检索过程中起作用. 这是深入把握Lucene实现的基础, 若要对Lucene作基础的调整和改动, 自然缺不了这一步(这是我的动机之一). 这种探索也帮助我了解原始文档资料的各种属性如何决定搜索结果, 进一步的研究可以揭示出文档各属性的重要性以及文档对查询条件的敏感性, 从这里出发可以提炼出更普遍的原理, 再结合通用的Search [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/236.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lucene PriorityQueue 优先队列</title>
		<link>http://www.hjide.com/article/235.htm</link>
		<comments>http://www.hjide.com/article/235.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:23:26 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=235</guid>
		<description><![CDATA[PriorityQueue&#160;&#160;实现一优先队列框架，实例非常简单，只需实现lessThan(Object a, Object b)方法即可，通过该方法可以控制大优先或小优先。 package org.apache.lucene.search;/** * 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 the License. * You may obtain a copy of the License at * *&#160;&#160;&#160;&#160; http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/235.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lucene HitCollector 的作用</title>
		<link>http://www.hjide.com/article/234.htm</link>
		<comments>http://www.hjide.com/article/234.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:22:20 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=234</guid>
		<description><![CDATA[HitCollector 的作用很简单，通过collect（）方法控制检索返回的结果，下面是lucene自带的一个例子&#8212;-使用一个优先队列，返回指定数目的Top n Doc。package org.apache.lucene.search;/** * 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 the License. * You may obtain a copy of the License at * *&#160;&#160;&#160;&#160; http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/234.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucene的排序修改</title>
		<link>http://www.hjide.com/article/233.htm</link>
		<comments>http://www.hjide.com/article/233.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:20:00 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=233</guid>
		<description><![CDATA[修改Similarity（相似度计算）DefaultSimilarity基本上可以满足一般的搜索要求。但是在有些应用中，你可以定制你自己的Similarity来服务你自己的应用需求。例如：有些人认为没有必要让文档短的文章得分更高一点 (参考 a “fair” similarity).修改Similarity需要同时对索引和搜索都进行修改，必须在搜索或者排序之间修改Similarity。 要定制你自己的Similarity，也就是你不想直接使用DefaultSimilarity，你只要在建立索引的之前调用IndexWriter.setSimilarity，或者在搜索之前调用Searcher.setSimilarity. 你如果想知道，别人都是怎么修改similarity的，你可以参考一下Lucene的邮件列表Overriding Similarity. 总的来说有下面这些修改: SweetSpotSimilarity &#8212; SweetSpotSimilarity gives small increases as the frequency increases a small amount and then greater increases when you hit the “sweet spot”, i.e. where you think the frequency of terms is more significant.Overriding tf &#8212; In some applications, it doesn&#39;t matter what the score of [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/233.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucene的使用与优化 zz</title>
		<link>http://www.hjide.com/article/232.htm</link>
		<comments>http://www.hjide.com/article/232.htm#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:14:13 +0000</pubDate>
		<dc:creator>Jock</dc:creator>
				<category><![CDATA[Lucene]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=232</guid>
		<description><![CDATA[1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架，而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用，它只是提供了一种工具让你能实现这些产品。1.2 lucene能做什么要回答这个问题，先要了解lucene的本质。实际上lucene的功能很单一，说到底，就是你给它若干个字符串，然后它为你提供一个全文搜索服务，告诉你你要搜索的关键词出现在哪里。知道了这个本质，你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了，做个资料库；你可以把一个数据库表的若干个字段索引起来，那就不用再担心因为“%like%”而锁表了；你也可以写个自己的搜索引擎……1.3 你该不该选择lucene下面给出一些测试数据，如果你觉得可以接受，那么可以选择。测试一：250万记录，300M左右文本，生成索引380M左右，800线程下平均处理时间300ms。测试二：37000记录，索引数据库中的两个varchar字段，索引文件2.6M，800线程下平均处理时间1.5ms。2 lucene的工作方式lucene提供的服务实际包含两部分：一入一出。所谓入是写入，即将你提供的源（本质是字符串）写入索引或者将其从索引中删除；所谓出是读出，即向用户提供全文搜索服务，让用户可以通过关键词定位源。2.1写入流程源字符串首先经过analyzer处理，包括：分词，分成一个个单词；去除stopword（可选）。将源中需要的信息加入Document的各个Field中，并把需要索引的Field索引起来，把需要存储的Field存储起来。将索引写入存储器，存储器可以是内存或磁盘。2.2读出流程用户提供搜索关键词，经过analyzer处理。对处理后的关键词搜索索引找出对应的Document。用户根据需要从找到的Document中提取需要的Field。3 一些需要知道的概念lucene用到一些概念，了解它们的含义，有利于下面的讲解。3.1 analyzerAnalyzer 是分析器，它的作用是把一个字符串按某种规则划分成一个个词语，并去除其中的无效词语，这里说的无效词语是指英文中的“of”、“the”，中文中的 “的”、“地”等词语，这些词语在文章中大量出现，但是本身不包含什么关键信息，去掉有利于缩小索引文件、提高效率、提高命中率。分词的规则千变万化，但目的只有一个：按语义划分。这点在英文中比较容易实现，因为英文本身就是以单词为单位的，已经用空格分开；而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍，这里只需了解分析器的概念即可。3.2 document用户提供的源是一条条记录，它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后，就是以一个Document的形式存储在索引文件中的。用户进行搜索，也是以Document列表的形式返回。3.3 field一个Document可以包含多个信息域，例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域，这些信息域就是通过Field在Document中存储的。Field有两个属性可选：存储和索引。通过存储属性你可以控制是否对这个Field进行存储；通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话，事实上对这两个属性的正确组合很重要，下面举例说明：还是以刚才的文章为例子，我们需要对标题和正文进行全文搜索，所以我们要把索引属性设置为真，同时我们希望能直接从搜索结果中提取文章标题，所以我们把标题域的存储属性设置为真，但是由于正文域太大了，我们为了缩小索引文件大小，将正文域的存储属性设置为假，当需要时再直接读取文件；我们只是希望能从搜索解果中提取最后修改时间，不需要对它进行搜索，所以我们把最后修改时间域的存储属性设置为真，索引属性设置为假。上面的三个域涵盖了两个属性的三种组合，还有一种全为假的没有用到，事实上Field不允许你那么设置，因为既不存储又不索引的域是没有意义的。3.4 termterm是搜索的最小单位，它表示文档的一个词语，term由两部分组成：它表示的词语和这个词语所出现的field。3.5 tockentocken是term的一次出现，它包含trem文本和相应的起止偏移，以及一个类型字符串。一句话中可以出现多次相同的词语，它们都用同一个term表示，但是用不同的tocken，每个tocken标记该词语出现的地方。3.6 segment添加索引时并不是每个document都马上添加到同一个索引文件，它们首先被写入到不同的小文件，然后再合并成一个大索引文件，这里每个小文件都是一个segment。4 lucene的结构lucene包括core和sandbox两部分，其中core是lucene稳定的核心部分，sandbox包含了一些附加功能，例如highlighter、各种分析器。Lucene core有七个包：analysis，document，index，queryParser，search，store，util。4.1 analysisAnalysis包含一些内建的分析器，例如按空白字符分词的WhitespaceAnalyzer，添加了stopwrod过滤的StopAnalyzer，最常用的StandardAnalyzer。4.2 documentDocument包含文档的数据结构，例如Document类定义了存储文档的数据结构，Field类定义了Document的一个域。4.3 indexIndex 包含了索引的读写类，例如对索引文件的segment进行写、合并、优化的IndexWriter类和对索引进行读取和删除操作的IndexReader 类，这里要注意的是不要被IndexReader这个名字误导，以为它是索引文件的读取类，实际上删除索引也是由它完成，IndexWriter只关心如何将索引写入一个个segment，并将它们合并优化；IndexReader则关注索引文件中各个文档的组织形式。4.4 queryParserQueryParser 包含了解析查询语句的类，lucene的查询语句和sql语句有点类似，有各种保留字，按照一定的语法可以组成各种查询。Lucene有很多种Query 类，它们都继承自Query，执行各种特殊的查询，QueryParser的作用就是解析查询语句，按顺序调用各种Query类查找出结果。4.5 searchSearch包含了从索引中搜索结果的各种类，例如刚才说的各种Query类，包括TermQuery、BooleanQuery等就在这个包里。4.6 storeStore包含了索引的存储类，例如Directory定义了索引文件的存储结构，FSDirectory为存储在文件中的索引，RAMDirectory为存储在内存中的索引，MmapDirectory为使用内存映射的索引。4.7 utilUtil包含一些公共工具类，例如时间和字符串之间的转换工具。5 如何建索引5.1 最简单的能完成索引的代码片断IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);Document doc = new Document();doc.add(new Field(“title”, “lucene introduction”, Field.Store.YES, Field.Index.TOKENIZED));doc.add(new Field(“content”, “lucene works well”, Field.Store.YES, Field.Index.TOKENIZED));writer.addDocument(doc);writer.optimize();writer.close();下面我们分析一下这段代码。首先我们创建了一个writer，并指定存放索引的目录为“/data/index”，使用的分析器为StandardAnalyzer，第三个参数说明如果已经有索引文件在索引目录下，我们将覆盖它们。然后我们新建一个document。我们向document添加一个field，名字是“title”，内容是“lucene introduction”，对它进行存储并索引。再添加一个名字是“content”的field，内容是“lucene [...]]]></description>
		<wfw:commentRss>http://www.hjide.com/article/232.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lucene In Action</title>
		<link>http://www.hjide.com/article/149.htm</link>
		<comments>http://www.hjide.com/article/149.htm#comments</comments>
		<pubDate>Wed, 10 Jan 2007 07:23:24 +0000</pubDate>
		<dc:creator>堕落天使</dc:creator>
				<category><![CDATA[Lucene]]></category>
		<category><![CDATA[下载]]></category>

		<guid isPermaLink="false">http://blog.tgb.net.cn/?p=149</guid>
		<description><![CDATA[Manning &#8211; Lucene in Action, A Guide to the Java Search Engine.pdf PDF文件下载]]></description>
		<wfw:commentRss>http://www.hjide.com/article/149.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

