自分で検索エンジンを書く(常に検索しましょう過程1#認識Lucene#)(Java、Lucene、hadoop)


今日から、手書きで2つ目の卒業設計をして、ブログにもプロジェクトの成長過程を記録して、みんなと一緒に勉強します~
まず、自分の社内検索エンジンを作るには、Luceneを知っておく必要があります.
1、Luceneの貢献者Doug Cuttingは自身の全文索引/検索専門家であり、かつてV-Twin検索エンジン(AppleのCoplandオペレーティングシステムの成果の一つ)の主な開発者であり、後にExciteで高級システムアーキテクチャデザイナーを務め、現在いくつかのINTERNETの下層アーキテクチャの研究に従事している.彼が貢献したLuceneの目標は、さまざまな中小アプリケーションに全文検索機能を加えることだ.2001年末にAPACHE財団jakartaのサブプロジェクトとなった.
2、LuceneはJavaベースの全文情報検索ツールパッケージで、完全な検索アプリケーションではなく、あなたのアプリケーションにインデックスと検索機能を提供します.Luceneは現在、Apache Jakartaファミリーの開元プロジェクトであり、Java開元全文検索ツールパッケージに基づいて最も流行している.
次にLuceneの勉強を始めます.
Java開発といえば、一般的に公式ダウンロード対応の開発パッケージを検索するのが第一ですが、ここでは紹介しません.これができない場合は、下に進む必要はありません.筆者は勉強が浅いので、自分ではAPIができません.ここでは古いlucene-2.4.0版を使って勉強しています.
Javaプロジェクトプロジェクトを新規作成します.このセクションでは、3つのjarパッケージlucene-analyzers-2.4.1.jar、lucene-core-2.4.1.jar、lucene-highlighter-2.4.1.jarを導入する必要があります.
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;


public class TestLucene {

	public static void main(String[] args)throws Exception{
		
		Analyzer analyzer = new StandardAnalyzer();  //   
		TokenStream tokenStream = analyzer.tokenStream("", new StringReader("this is first lucene project"));
		Token token = new Token(); 
		while(null != tokenStream.next(token))
			System.out.println(token.term());
		
	}
}

出力結果:
first
lucene
project

次のLuceneのコアインデックスクラスを見てみましょう.
IndexWriter:インデックスのコアコンポーネントを作成します.IndexWriterを使用すると、新しいインデックスを作成し、オブジェクトファイルをインデックスに追加できますが、読み取りと検索はできません.
Directory:luceneインデックス・アイテムの場所を表します.これは、FSDirectoryとRAM Directoryを具体的に実装する抽象クラスです.前者はハードディスク(HDD)にインデックスを書き込み、実際のファイルシステムパスに対応し、後者はインデックスをメモリに書き込み、前者よりも効率が高いが空き容量が少ない.
Analyzer:テキストの内容を分析する抽象クラスで、具体的な実現には、停用語切除、語幹分析、大文字と小文字の切り替えなどの機能があります.
Document:パス、タイトル、要約、変更日など、複数のフィールドからなるテキストが処理されたオブジェクトと見なすことができます.
Field:テキストの一部のデータに対応するフィールドで、検索時に結果に基づいて抽出しやすい.
Filed使用:
import org.apache.lucene.document.Field;

public class TestField {

	public static void main(String[] args){
		Field field = new Field("fname", "fvalue", Field.Store.YES, Field.Index.ANALYZED);
	}
}
fname、fvalueはfieldの名前と値であり、後に2つのパラメータが格納とインデックスのいくつかの操作を指す.
Luceneとデータベースのクラス比
コンセプト:
データベース#データベース#                               Lucene
列/フィールド                              Field
行/レコード                              Document
操作:
照会(SELECT)           Searcher
追加(INSERT)            IndexWriter.addDocument
削除(DELETE)           IndexReader.delete
修正(UPDATE)           サポートされていません(削除後に再追加可能)
システムの内容を簡単に分析する:
2つの文章1と2が設けられている
文章1の内容は:Tom lives in Guangzhou,I live in Guangzhou too.
文字2の内容は:He once lived in Shanghai.
1)キーワード処理,例えばlives-live(復元)である.
LuceneでAnalyzerクラスが完了した後
文章1のすべてのキーワードは:[tom][live][live][guangzhou]
文章2のすべてのキーワードは:[he][live][shanghai]
2)逆インデックス
上の対応関係は、「文章番号」が「文章中のすべてのキーワード」である.逆インデックスはこの関係を逆にし、「キーワード」が「そのキーワードを持つすべての文章番号」になる.
文章1,2は逆組みになっている(キーワード文章番号)
guangzhou 1
he 2
i 1
live 1,2
shanghai 2
tom 1
3)「出現頻度」と「出現位置」の情報を加えると、インデックス構造は次のようになります.
キーワード記事番号[出現頻度]  出現位置
guangzhou 1 [2] 3,6
he 2 [1] 1
i 1 [1] 4
live 1 [2],2 [1] 2,5,2
shanghai 2 [1] 3
tom 1 [1]
ライヴという行為の例では、ライヴは文章1に2語、文章2に1回、彼の出現位置は「2,5,2」である.これは何を表しているのか.文章番号と出現頻度を結びつけて分析する必要がある.文章1に2語、「2,5」はライヴが文章1に現れた2つの位置、文章2に1回、残りの2つを表す.「ライブは2番目のキーワードです.