<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>검색엔진 루씬 lucene &amp; hadoop</title>
		<link>http://www.lucene.kr/</link>
		<description>검색과 플래폼에 관한 이야기들</description>
		<language>ko</language>
		<pubDate>Mon, 16 Mar 2009 21:28:13 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<image>
		<title>검색엔진 루씬 lucene &amp; hadoop</title>
		<url><![CDATA[http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzUwOTMyQGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5naWY%3D]]></url>
		<link>http://www.lucene.kr/</link>
		<description>검색과 플래폼에 관한 이야기들</description>
		</image>
		<item>
			<title>Searcher Sample</title>
			<link>http://www.lucene.kr/27</link>
			<description>package com.gruter.lia.meetlucene;&lt;br /&gt;
&lt;br /&gt;import java.io.File;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
&lt;br /&gt;import org.apache.lucene.analysis.standard.StandardAnalyzer;&lt;br /&gt;
import org.apache.lucene.document.Document;&lt;br /&gt;
import org.apache.lucene.queryParser.QueryParser;&lt;br /&gt;
import org.apache.lucene.search.Hits;&lt;br /&gt;
import org.apache.lucene.search.IndexSearcher;&lt;br /&gt;
import org.apache.lucene.search.Query;&lt;br /&gt;
import org.apache.lucene.search.ScoreDoc;&lt;br /&gt;
import org.apache.lucene.search.TopDocs;&lt;br /&gt;
import org.apache.lucene.store.Directory;&lt;br /&gt;
import org.apache.lucene.store.FSDirectory;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
/**&lt;br /&gt;
* Lucene version 2.4&lt;br /&gt;
* Lucene In Action 1.4.2 색인 내의 검색 코드에 대한 버전 수정본&lt;br /&gt;
**/&lt;br /&gt;
public class Searcher {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; public static void main(String[] args) throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (args.length != 2) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Exception(&quot;Usage: java &quot; + Searcher.class.getName()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + &quot; &amp;lt;index dir&amp;gt; &amp;lt;query&amp;gt;&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; File indexDir = new File(args[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String q = args[1];&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (!indexDir.exists() || !indexDir.isDirectory()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Exception(indexDir +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; does not exist or is not a directory.&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; search(indexDir, q);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; public static void search(File indexDir, String q)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throws Exception {&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Directory fsDir = FSDirectory.getDirectory(indexDir, false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Directory fsDir = FSDirectory.getDirectory(indexDir);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IndexSearcher is = new IndexSearcher(fsDir);&lt;br /&gt;
&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Query query = QueryParser.parse(q, &quot;contents&quot;,&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new StandardAnalyzer());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; QueryParser parser = new QueryParser(&quot;contents&quot;, new StandardAnalyzer());&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Query query = parser.parse(q);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; long start = new Date().getTime();&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Hits hits = is.search(query);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TopDocs docs = is.search(query, 100);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; long end = new Date().getTime();&lt;br /&gt;
&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.err.println(&quot;Found &quot; + hits.length() +&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; document(s) (in &quot; + (end - start) +&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; milliseconds) that matched query &#039;&quot; +&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q + &quot;&#039;:&quot;);&lt;br /&gt;
//&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; hits.length(); i++) {&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Document doc = hits.doc(i);&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(doc.get(&quot;filename&quot;));&lt;br /&gt;
//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; System.err.println(&quot;Found &quot; + docs.totalHits +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; document(s) (in &quot; + (end - start) +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot; milliseconds) that matched query &#039;&quot; +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q + &quot;&#039;:&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ScoreDoc[] scores = docs.scoreDocs;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; float maxScore = docs.getMaxScore();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0 ;i&amp;lt;docs.scoreDocs.length;i++){&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Document doc = is.doc(docs.scoreDocs[i].doc);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(doc.get(&quot;filename&quot;));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;</description>
			<category>Lucene In Action</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/27</guid>
			<comments>http://www.lucene.kr/27#entry27comment</comments>
			<pubDate>Tue, 03 Mar 2009 15:29:21 +0900</pubDate>
		</item>
		<item>
			<title>Indexer Sample</title>
			<link>http://www.lucene.kr/26</link>
			<description>&lt;br /&gt;
&lt;br /&gt;
package com.gruter.lia.meetlucene;&lt;br /&gt;
&lt;br /&gt;
import java.io.File;&lt;br /&gt;
import java.io.FileReader;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.Date;&lt;br /&gt;
&lt;br /&gt;
import org.apache.lucene.analysis.standard.StandardAnalyzer;&lt;br /&gt;
import org.apache.lucene.document.Document;&lt;br /&gt;
import org.apache.lucene.document.Field;&lt;br /&gt;
import org.apache.lucene.index.IndexWriter;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Lucene version 2.4&lt;br /&gt;
* Lucene In Action 1.4.1 색인만들기 코드에 대한 버전 수정본&lt;br /&gt;
**/&lt;br /&gt;
&lt;br /&gt;public class Indexer {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;public static void main(String[] args) throws Exception {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (args.length != 2) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; throw new Exception(&quot;Usage: java &quot; + Indexer.class.getName()&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; + &quot; &amp;lt;index dir&amp;gt; &amp;lt;data dir&amp;gt;&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; File indexDir = new File(args[0]);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; File dataDir = new File(args[1]);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; long start = new Date().getTime();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int numIndexed = index(indexDir, dataDir);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; long end = new Date().getTime();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; System.out.println(&quot;Indexing &quot; + numIndexed + &quot; files took &quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; + (end - start) + &quot; milliseconds&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; public static int index(File indexDir, File dataDir)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; throws IOException {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (!dataDir.exists() || !dataDir.isDirectory()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; throw new IOException(dataDir&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; + &quot; does not exist or is not a directory&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
// &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; IndexWriter writer = new IndexWriter(indexDir,&lt;br /&gt;
// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; new StandardAnalyzer(), true);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; writer.setUseCompoundFile(false);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; indexDirectory(writer, dataDir);&lt;br /&gt;
&lt;br /&gt;
// &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int numIndexed = writer.docCount();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int numIndexed = writer.numDocs();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; writer.optimize();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; writer.close();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return numIndexed;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; private static void indexDirectory(IndexWriter writer, File dir)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; throws IOException {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; File[] files = dir.listFiles();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; files.length; i++) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; File f = files[i];&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (f.isDirectory()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; indexDirectory(writer, f);&amp;nbsp; // recurse&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } else if (f.getName().endsWith(&quot;.txt&quot;)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; indexFile(writer, f);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; private static void indexFile(IndexWriter writer, File f)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; throws IOException {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (f.isHidden() || !f.exists() || !f.canRead()) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; System.out.println(&quot;Indexing &quot; + f.getCanonicalPath());&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Document doc = new Document();&lt;br /&gt;
&lt;br /&gt;
// &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; doc.add(Field.Text(&quot;contents&quot;, new FileReader(f)));&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;doc.add(new Field(&quot;contents&quot;, new FileReader(f)));&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc.add(new Field(&quot;filename&quot;, f.getCanonicalPath(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; writer.addDocument(doc);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;</description>
			<category>Lucene In Action</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/26</guid>
			<comments>http://www.lucene.kr/26#entry26comment</comments>
			<pubDate>Tue, 03 Mar 2009 15:08:41 +0900</pubDate>
		</item>
		<item>
			<title>lucene scoring(ver 2.4)</title>
			<link>http://www.lucene.kr/25</link>
			<description>&lt;br /&gt;
how to get lucene (document) score.&lt;br /&gt;
&lt;br /&gt;TopDocs docs = searcher.search(query, null, 10,&amp;nbsp; defaultSort);&lt;br /&gt;
ScoreDoc[] scores = docs.scoreDocs;&lt;br /&gt;
float maxScore = docs.getMaxScore();&lt;br /&gt;
for (int i=0 ;i&amp;lt;docs.scoreDocs.length;i++){ &amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; Document doc = searcher.doc(docs.scoreDocs[i].doc);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; float docscore = scores[i].score / maxScore;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
another sample : http://devyongsik.tistory.com/203&lt;br /&gt;</description>
			<category>루씬Tip</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/25</guid>
			<comments>http://www.lucene.kr/25#entry25comment</comments>
			<pubDate>Thu, 26 Feb 2009 00:28:02 +0900</pubDate>
		</item>
		<item>
			<title>루씬의 기본구조</title>
			<link>http://www.lucene.kr/19</link>
			<description>루씬의 주요한 함수를 꼽으라면&lt;br /&gt;&lt;br /&gt;데이터를 인덱싱하는 IndexWriter&lt;br /&gt;데이타를 검색하는 IndexSearcher&lt;br /&gt;데이타를 읽는 IndexReader&lt;br /&gt;&lt;br /&gt;이 세개를 말할수 있습니다.&lt;br /&gt;&lt;br /&gt;단순한 검색서비스를 제공하고자 한다면 IndexWriter와 IndexSearcher 이 두개만 있으면 됩니다.&lt;br /&gt;&lt;br /&gt;이 세가지의 공통점을 꼽는다면&lt;br /&gt;모두가 동일한 Directory를 바라보고 있다는 겁니다.&lt;br /&gt;&lt;br /&gt;개별로 움직이는 것들이 하나의 Directory를 가지고 지지고 볶고 합니다.&lt;br /&gt;&lt;br /&gt;그렇지만 이 세개는 아쉽게도 서로 사용시 Sync를 맞추지 못합니다.&lt;br /&gt;&lt;br /&gt;동상이몽하는 셈이죠.&lt;br /&gt;하나의 변경이 다른 것에 영향을 미치지 못하고 지가 보고 있는 허상만을 건들고 있다는 겁니다.&lt;br /&gt;&lt;br /&gt;즉, IndexWriter가 인덱싱을 하는데 이넘의 IndexReader나 IndexSearcher는 그 사실을 알지 못합니다.&lt;br /&gt;snapshot이라고 해야 하나요. 자기가 처음 인스턴스를 생성했을때 그 모습만을 바라보고 있습니다. 새로운 인덱싱이 추가되었는지 알지 못해요. 그래서, 데이터를 추가했는데 검색안된다고 아우성입니다.&lt;br /&gt;&lt;br /&gt;그렇기 때문에 추가된 사항을 반영하려면 항상 필요할때마다 반복해서 인스턴스(Directory를 읽기위한)를 생성해야 합니다.&lt;br /&gt;&lt;br /&gt;이러다 보니 실시간으로 처리하는 데이터 입출력 시스템에서는 별로 유효하지 않습니다.&lt;br /&gt;엄청난 노가다를 해야 하는 셈이죠^^&lt;br /&gt;&lt;br /&gt;참고로 이 루씬의 Directory는 하나의 문서를 표현하는 Document들로 구성되어 있으며&lt;br /&gt;이 Document를 이루는 개별 필드인 Field로 구성되어 있습니다.&lt;br /&gt;물론 데이터 관점에서 이런것이고 그 이외에 필요한 여러 파일들이 존재하고 있죠.&lt;br /&gt;&lt;br /&gt;위의 3가지 IndexWriter, Reader, Searcher와 Document, Field의 개념만 알고 있어도 루씬을 사용하는데 아무런 지장이 없습니다.&lt;br /&gt;&lt;br /&gt;문제는 많은 분들이 위에서 지적한 snapshot의 원리를 기억하지 못하고 헤멘다는 겁니다.^^</description>
			<category>루씬강좌</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/19</guid>
			<comments>http://www.lucene.kr/19#entry19comment</comments>
			<pubDate>Thu, 30 Aug 2007 11:00:47 +0900</pubDate>
		</item>
		<item>
			<title>루씬으로 할수 있는것.</title>
			<link>http://www.lucene.kr/18</link>
			<description>&lt;P&gt;&lt;br /&gt;루씬으로 pdf, hwp, doc 파일을 검색할수 있나요?&lt;br /&gt;없습니다. 불가능합니다.&lt;br /&gt;&lt;br /&gt;루씬으로 DB검색할수 있나요?&lt;br /&gt;불가능합니다.&lt;br /&gt;&lt;br /&gt;루씬으로 웹검색을 할수 있나요?&lt;br /&gt;NO..&lt;br /&gt;&lt;br /&gt;그럼 도대체 뭘 할수 있나요?&lt;br /&gt;&lt;br /&gt;검색을 할수 있습니다.&lt;br /&gt;pdf던, hwp, doc 문서던&lt;br /&gt;DB던 이것을 읽어 TEXT로 변환시킬수 있는 GATE만 만들수 있다면&lt;br /&gt;루씬은 원하는 검색을 할수 있습니다.&lt;br /&gt;크롤을 별도로 만들면 웹문서 검색도 할수 있습니다.&lt;br /&gt;&lt;br /&gt;루씬은 들어오는 TEXT를 인덱싱하고 해당 인덱싱중 원하는 키워드를 포함하는 TEXT를 찾아주는 Library입니다.&lt;br /&gt;&lt;br /&gt;이렇게 보면 별것 아니죠?&lt;br /&gt;사실 별것 아녀요.^^&lt;br /&gt;&lt;br /&gt;그렇지만 반대로 생각하면&lt;br /&gt;GATE만 만들게 되면 검색에 관한 모든것을 해결해 줄수 있는 막강 검색엔진의 역할을 할수 있습니다.&lt;br /&gt;&lt;br /&gt;하면 할수록 그 깊이가 의심(?)되는 루씬의 세계로 가봅시다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUwOTMyQGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMy5naWY%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;267&quot; width=&quot;314&quot;/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;출처 :&lt;A href=&quot;http://www-128.ibm.com/developerworks/library/wa-lucene/indexing_architecture.gif&quot;&gt;http://www-128.ibm.com/developerworks/library/wa-lucene/indexing_architecture.gif&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;&lt;/P&gt;</description>
			<category>루씬강좌</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/18</guid>
			<comments>http://www.lucene.kr/18#entry18comment</comments>
			<pubDate>Mon, 20 Aug 2007 16:00:06 +0900</pubDate>
		</item>
		<item>
			<title>1.1 정보검색문제의 예 - .1</title>
			<link>http://www.lucene.kr/17</link>
			<description>&lt;P&gt;&lt;br /&gt;많은 사람들이 가지고 있는 장서들중 하나는 세익스피어전집이다. &quot;Brutus AND Ceasar AND NOT Calpurnia&quot; 라는 단어들을 찾기위해 이들을 포함하는 세익스피어의 작품을 찾는다고 가정해보자. 그중 한가지 방법은 처음부터 끝까지 모든 텍스트들을 읽는것인데 이경우 &quot;Brutus&quot; 와 &quot;Caesar&quot;를 포함하거나 &quot;Calpurnia&quot;를 포함하지 않는지를 고려하지 않고 모든 작품을 읽어야 한다. 문서검색을 하는 심플한 형태는 컴퓨터가 모든 문서를 선형적으로 스캔하게 하는 것이다. 이러한 프로세스는 텍스트를 &quot;grepping&quot;하는 것으로 주로 알려진, Unix 명령어인 grep같은 것이 이것을 수행한다. 문서를 grepping하는 것은 특히 현대컴퓨터들의 빠른 속도하에서 매우 효과적인 프로세스가 될수 있고, &quot;정규표현식&quot;을 사용하는 와이들카드 패턴매칭을 위한 유용한 도구를 제공한다. 현대 컴퓨터에게는 단순한 쿼리들에 대해서는 grep 외에는 필요하지 않을 수 있다.(세익스피어의 전집에서 사용되는 것은 기껏해야 100만단어 미만이다.)&lt;/P&gt;
&lt;P&gt;그러나 많은 목적을 위해서는 더 많은 것들이 필요하다:&lt;br /&gt;1.많은 수의 문서콜렉션들을 빨리 처리하기 위해서: 온라인 데이터의 수는 컴퓨터의 속도만큼이나 빨리 증가하고 있고 현재 우리는 수십억에서 수백억의 단어들을 처리해야 한다.&lt;/P&gt;
&lt;P&gt;2.좀더 유연한 매칭처리를 허용해야 한다. :예를 들어 &quot;5단어들 이내에&quot; 혹은 &quot;동일 문단에서&quot;라는 조건으로 &quot;Romans NEAR countrymen&quot;이란 쿼리를 grep 처리하는 것은 비현실적이다.&lt;/P&gt;
&lt;P&gt;3. 랭킹된 검색을 허용하기 위해서 필요하다.: 많은 경우에 있어 특정단어를 포함하는 수많은 문서들 중에서&amp;nbsp; 좀더 나의 답을 제공하는 결과를 원할수 있다.&lt;/P&gt;
&lt;P&gt;미리말하자면 각 쿼리에 대해 문서를 선형적으로 스캐닝하는 것을 피하는 방법은 문서들을 &quot;인덱스&quot;하는 것이다. 세익스피어 전집으로 돌아가서 Boolean 검색모델을 설명해보자. 각 문서들에 대하여 - 여기서는 세익스피어 작품- 세익스피어가 사용한 모든 단어들 가운데(세익스피어는 약 32,000정도의 단어를 사용했다.) 각 문서가 사용했던 안했던 간에 그 문서들을 기록한다고 가정해보자. 도 1.1에서 보듯이 그 결과는 쌍으로 이루어진 term-document &quot;출현 매트릭스&quot;로 된다. 여기서 &quot;term&quot;은 &quot;단어&quot;를 의미하는데 정보검색연구에서는 &quot;term&quot;이란 단어를 주로 선호한다. 이 매트릭스의 행이나 열을 살펴보면 각 텀에 대해 벡터값을 가질수 수있는데 이것은 해당 텀이 나타나는 문서들을 보여주는 것이고, 각 문서에 대한 벡터값을 가질수도 있는데 이것은 해당 문서에서 출현하는 텀들을 보여준다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUwOTMyQGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMS5naWY%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;204&quot; width=&quot;540&quot;/&gt;&lt;/div&gt;도 1-1. 텀-문서 출현 매트릭스. (i,j)의 값은 해당 칼럼으로 표현되는 작품 j가 행으로 표현되는 단어 i를 포함하면 &quot;1&quot;이 되고 그렇지 않으면 &quot;0&quot;이 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&quot;Brutus AND Casesar AND NOT Calpurnia&quot;라는 쿼리에 답하기 위해 Brutus, Caesar와 ㅡCalpurnia에 대한 벡터값들을 취할수 있는데 이때 AND에 대한 비트연산을 수행한다.&lt;br /&gt;&amp;nbsp;110100 AND 110111 AND 101111 = 100100&lt;br /&gt;따라서 이 쿼리에 대한 답은 &quot;Anthony and Cleopatra and Hamlet&quot;이 되게 된다(도1-2) &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUwOTMyQGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMi5naWY%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;174&quot; width=&quot;540&quot;/&gt;&lt;/div&gt;도1-2.&quot;Brutus AND Casesar AND NOT Calpurnia&quot;에 대한 세익스피어 작품 검색결과&lt;/P&gt;
&lt;P&gt;Boolean 검색모델은 텀에 대한 Boolean으로 표현되는 형식의 쿼리로 언급하면 쉽다. 즉 텀들은 AND, OR, 그리고 NOT 연산으로 조합되어진다. 이러한 쿼리들은 단어의 집합으로서 각 문서들을 바라보게된다.&lt;br /&gt;&amp;nbsp;&lt;/P&gt;</description>
			<category>Information Retrieval</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/17</guid>
			<comments>http://www.lucene.kr/17#entry17comment</comments>
			<pubDate>Wed, 08 Aug 2007 20:45:59 +0900</pubDate>
		</item>
		<item>
			<title>1. Boolean Model을 이용한 정보검색(Information Retrieval)</title>
			<link>http://www.lucene.kr/16</link>
			<description>&lt;P dir=ltr style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;br /&gt;정보검색(Information Retrieval)이라는 용어의 의미는 상당히 광범위하다. 어쩌면 지갑에서 신용카드를 꺼내서 카드번호를 적는 그 자체도 정보검색의 일종이다. 하지만 학술적으로는 다음과 같이 정의될수 있다.&lt;br /&gt;&lt;br /&gt;&quot;정보검색(IR)이란 (주로 컴퓨터에 저장되어 있는) 방대한 콜렉션안에 있는 정보욕구를 해결해주는, 구조화되지 않은 자연상태(주로 text로 된)의 물질(문서같은)을 찾는 것이다&quot;&lt;br /&gt;&lt;br /&gt;이렇게 정의되는 정보검색은 도서관 사서, 법률 보조원과 전문 검색사들 같은 소수의 사람들만이 했던 활동으로 여겨져왔다. 지금은 세상이 변했고 수백만의 사람들이 웹검색엔진을 이용하고 자신의 이메일을 사용하면서 매일 정보검색을 하고 있다. 정보검색은 정보를 접근하는데 있어 강력한 방법으로 빠르게 변화하고 있으며 전통적인 데이터베이스방식의 검색을 추월하고 있다.&lt;br /&gt;&lt;br /&gt;정보검색은 위에서 언급한 핵심적 정의를 넘어서 다른 종류의 데이터나 정보문제로까지 확장될수 있다. &quot;비정형화된 데이터&quot;라는 것은 명확하지 않고, 의미론적으로 명백하지 않으며, 컴퓨터가 이해하기 쉽지않는 구조를 가진&amp;nbsp; 데이터를 말한다. 그것은 구조화된 데이터의 반대개념으로 표준적인 예로, 분류를 주업으로 하는 회사들이 상품목록이나 개인정보들을 유지하기 위해 주로 사용하는 관계형데이터베이스를 들수 있다. 현실적으로는 완전히 &quot;비정형적인&quot; 데이터는 존재하지 않는다. 만약 당신이 인간이 사용하는 언어들의 잠재적인 언어구조를 세어본다면 모든 텍스트 데이터에 대하여 이말이 맞다는걸 확인할수 있을것이다. 그러나 이러한 것들이 명백히 구조화되었다는 것을 인정한다면 대부부분의 텍스트는 구조를 가지고 있는것을 알수 있는데 그것은 명백히 마크업으로 표현된 문서에서 주로 나타나는 제목, 문단 각주 등의 구조를 가지고 있다. 정보검색은 또한 &quot;자바&quot;를 제목에서 가지고 있고 본문엔 여러가지를 단어들을 가지는 문서를 찾는것처럼 &quot;준-구조화된&quot; 검색을 용이하게 하는데 사용되기도 한다.&lt;br /&gt;&lt;br /&gt;정보검색분야는 또한 문서들을 처리하거나 검색된 문서집합을 점더 깊이 처리하는 과정을 포괄하기도 한다. 문서집합이 주어진다면 클러스터링은 문서들의 내용에 기초하여 좋은 문서그룹을 만드는 일을 한다. 주제가 주어진다면 분류는 각 문서가 어디에 속해있는가를 결정하는 일을 수행한다. 대체로 처음엔 수동으로 일정 문서들을 분류한다음에 새로운 문서에 대해서는 자동으로 분류되겠끔 처리하는 것이 보통이다.&lt;br /&gt;&lt;br /&gt;이 장에서는 정보검색에 수반되는 문제점을 시작으로 텀-문서 매트릭스 구조의 아이디어를 살펴보며, 중심적인 역인덱스데이터 구조를 살펴볼것이다. 그런다음에 Boolean 검색모델과 어떻게 쿼리들이 처리되는지를 살펴볼것이다.&lt;/P&gt;</description>
			<category>Information Retrieval</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/16</guid>
			<comments>http://www.lucene.kr/16#entry16comment</comments>
			<pubDate>Tue, 07 Aug 2007 20:22:00 +0900</pubDate>
		</item>
		<item>
			<title>application이 아닌 library로서의 루씬</title>
			<link>http://www.lucene.kr/15</link>
			<description>루씬을 접하면서 많이들 잘못생각하는 것중의 하나가&lt;br /&gt;루씬이 이미 잘 만들어진 제품(application)으로 착각하는 것입니다.&lt;br /&gt;&lt;br /&gt;루씬은 검색엔진제품을 만들어주는 기반이 되는 Library이지 이미 만들어진 제품이 아닙니다.&lt;br /&gt;제품의 영역은 개발자 자신이 얼마나 해당 Library를 잘 이해하고 접목하느냐의 능력에 달려 있습니다.&lt;br /&gt;&lt;br /&gt;그렇기 때문에 &quot;공짜야&quot;하면서 달려든 루씬 사용자들은 그 검색엔진의 깊이를 감당하지 못하고 나자빠집니다.&lt;br /&gt;&lt;br /&gt;lucene library와 search application과의 관계를 간략히 도식화 하면 다음과 같습니다.&lt;br /&gt;(출처 : &lt;A href=&quot;http://www.webreference.com/programming/lucene/fig1-5.jpg&quot;&gt;http://www.webreference.com/programming/lucene/fig1-5.jpg&lt;/A&gt;)&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs2.tistory.com/upload_control/download.blog?fhandle=YmxvZzUwOTMyQGZzMi50aXN0b3J5LmNvbTovYXR0YWNoLzAvMC5qcGc%3D&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;424&quot; width=&quot;500&quot;/&gt;&lt;/div&gt;&lt;br /&gt;그렇기 때문에&lt;br /&gt;동일한 제품을 만들더라도 그 제품을 만드는 모든 개발자가 좋은 제품을 만드는 것이 아니듯&lt;br /&gt;루씬에 대한 이해와 활용능력에 따라 검색엔진(서비스)의 품질도 달라집니다.&lt;br /&gt;&lt;br /&gt;그래서 루씬도 공부 많이 해야합니다.^^&lt;br /&gt;&lt;br /&gt;</description>
			<category>루씬강좌</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/15</guid>
			<comments>http://www.lucene.kr/15#entry15comment</comments>
			<pubDate>Tue, 07 Aug 2007 13:52:00 +0900</pubDate>
		</item>
		<item>
			<title>검색엔진의 종류</title>
			<link>http://www.lucene.kr/14</link>
			<description>&lt;br /&gt;검색한다는 것은 존재하는 무엇을 찾아준다는 것입니다.&lt;br /&gt;그 존재하는 것은 여러가지의 목적물이 될수 있는데 이것은 문서, 장소 등에 구애받지 않습니다.&lt;br /&gt;&lt;br /&gt;그 중에서 &lt;FONT color=#ff0000&gt;검색엔진은 자신이 해석할 수 있는 &quot;텍스트로 표현&quot;될수 있는&lt;/FONT&gt; 목적물을 찾아줍니다.&lt;br /&gt;장소, 사람 등도 텍스트로 표현될수 있거나 이미 표현되어 있다면 그 무엇이든 검색엔진은 찾아줄수 있습니다.&lt;br /&gt;&lt;br /&gt;&quot;검색엔진&quot;이란 말을 접하면 사람들은 각기 다른 도구를 생각합니다.&lt;br /&gt;어떤 사람은 포털같은 웹서비스를 떠오르기도 하고&lt;br /&gt;어떤 사람은 웹문서를 수집하는 크롤러를, &lt;br /&gt;또 어떤 사람은 검색엔진 기술을 가진 업체를 떠올리기도 합니다.&lt;br /&gt;심지어는 데이터베이스를 떠올리기도 합니다.&lt;br /&gt;&lt;br /&gt;사실 &quot;검색&quot;을 구현하는 &quot;검색엔진&quot;은 여러가지로 표현될수 있습니다만&lt;br /&gt;기술적인 의미에서 볼때 &lt;FONT color=#ff0000&gt;&quot;검색서비스&quot;와 &quot;검색엔진&quot;은 다른 의미입니다.&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;기술적인 의미에서의 좀 더 넓은 검색엔진은 &lt;br /&gt;- 자료를 인덱싱하고 찾아주는 순수한 의미의 검색기술인 정보검색(Information Retrieval)기술과&lt;br /&gt;- 검색엔진에 자료를 가져다 주는 크롤링 기술&lt;br /&gt;- 좀 더 다양하고 효과적인 방법으로 검색을 수행하고 표현하는 클러스터링 기술, 자동분류 기술 &lt;br /&gt;등을 들수 있습니다.&lt;br /&gt;&lt;br /&gt;요즘처럼 시맨틱 웹이나 온톨로지, 시소러스 등의 개념이나 기술들도 검색엔진의 한 분야로 볼수 있을 정도로 검색엔진의 범위규정은 쉽지가 않습니다.&lt;br /&gt;&lt;br /&gt;그러나 이모든 &lt;FONT color=#ff0000&gt;검색엔진기술이 추구하는 목적들은&lt;br /&gt;&quot;잘 찾아주기&quot; 위한 것입니다&lt;/FONT&gt;.&lt;br /&gt;&lt;br /&gt;이러한 광범한 기능중에&lt;br /&gt;루씬은 문서를 &quot;잘 인덱싱하고 빨리 찾아주기&quot;위한 순수한 Information Retrieval Library중의 하나입니다.&lt;br /&gt;&lt;br /&gt;검색엔진을 다루면서 항상 염두에 두어야 할것은&lt;br /&gt;검색엔진이 해석하고 처리할 수 있는 부분만이 가능하다는 것입니다.&lt;br /&gt;&lt;br /&gt;검색엔진은 만능이 아닙니다.&lt;br /&gt;그렇기 때문에서 사용하는 검색엔진의 깊은 내막이나 사용법을 잘 이해할 필요가 있습니다.&lt;br /&gt;&lt;br /&gt;그 이상은 불가능합니다.&lt;br /&gt;&quot;꼬우면 직접 만드세요^^&quot;</description>
			<category>루씬강좌</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/14</guid>
			<comments>http://www.lucene.kr/14#entry14comment</comments>
			<pubDate>Tue, 07 Aug 2007 12:11:39 +0900</pubDate>
		</item>
		<item>
			<title>Scale-up versus Scale-out</title>
			<link>http://www.lucene.kr/13</link>
			<description>comparing scaling-up (using bigger boxes) to scaling-out (using more boxes)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;scale-out solutions have an indisputable performance and price/performance advantage over scale-up for search workloads.&lt;br /&gt;&lt;br /&gt;&lt;A href=&quot;http://blog.lucene.com/2007/07/30/scale-up-versus-scale-out/&quot;&gt;http://blog.lucene.com/2007/07/30/scale-up-versus-scale-out/&lt;/A&gt;</description>
			<category>hadoop</category>
			<author>gruter</author>
			<guid>http://www.lucene.kr/13</guid>
			<comments>http://www.lucene.kr/13#entry13comment</comments>
			<pubDate>Tue, 31 Jul 2007 07:13:45 +0900</pubDate>
		</item>
	</channel>
</rss>
