ホームページ  >  記事  >  Java  >  Lucene の構成とインデックス作成と全文検索のための画像とテキストコードの詳細な説明

Lucene の構成とインデックス作成と全文検索のための画像とテキストコードの詳細な説明

黄舟
黄舟オリジナル
2017-09-06 10:03:011545ブラウズ

Lucene


オープンソースの全文検索エンジンツールキットですが、完全な全文検索エンジンではなく、完全なクエリエンジンとインデックスエンジン、そして、テキスト分析エンジン (西欧の 2 言語、英語とドイツ語)。 Lucene の目的は、ターゲット システムに全文検索機能を簡単に実装したり、それに基づいて完全な全文検索エンジンを構築したりするための、シンプルで使いやすいツールキットをソフトウェア開発者に提供することです。

利点


(1) インデックスファイル形式はアプリケーションプラットフォームに依存しません。 Lucene は、異なるプラットフォーム上の互換性のあるシステムまたはアプリケーションが、作成されたインデックス ファイルを共有できるように、8 ビットのバイトベースのインデックス ファイル形式のセットを定義します。

(2) 従来の全文検索エンジンの逆インデックスに基づいて、ブロック インデックスが実装されており、新しいファイルに対して小さなファイル インデックスを確立し、インデックス作成速度を向上させることができます。その後、元のインデックスとマージすることで、最適化の目的が達成されます。

(3) 優れたオブジェクト指向システム アーキテクチャにより、Lucene 拡張機能の学習が容易になり、新しい機能の拡張が容易になります。

(4) 言語やファイル形式に依存しないテキスト分析インターフェイスが設計されており、ユーザーはトークン ストリームを受け入れるだけでインデックス ファイルの作成を完了し、新しい言語を拡張することができます。ファイル形式。

(5) 一連の強力なクエリ エンジンがデフォルトで実装されており、システムが強力なクエリ機能を取得できるようにするためにユーザーが独自のコードを記述する必要はありません。デフォルトでブール演算とあいまい検索が実装されています。 )、グループクエリなど。

コンセプト


まず、長い間出回っていたこの写真をご覧ください。私の理解では、それは次のとおりです。

左側: それはコレクションです。オンライン、テキスト、データベースなどのさまざまなデータのインデックスを収集します

右側: ユーザーが検索してインデックスを作成し、結果を返すプロセスです

Lucene の設定


jar パッケージを導入し、インデックス ファイルを作成するのは非常に簡単です

私は 6.6.0 コア パッケージの最新バージョン: lucene-core-6.6.0.jar を使用しています。公式ウェブサイト http://lucene.apache.org/ からダウンロードできます。テストには 1 つのパッケージで十分です

インデックス ファイルは、index です。ファイル名は、内部のコンテンツが自動的に生成されるため、自由に選択できます。 . これはインデックス ディレクトリです。興味があれば試してみてください。ただし、この jar パッケージは、アナライザーの単語分割処理用の拡張パッケージです。これら 2 つのディレクトリは、上記の Lucene コンセプト マップと同じレベルにあり、実際には、これらの例外を直接処理する必要があります。面倒です

public static void createindex() throws Exception {
        //创建文件目录    创建在项目目录下的index中
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/index"));
        //分词处理         是一个抽象类 一种单字分词,标准的
        Analyzer analyzer=new IKAnalyzer();
        //创建IndexWriterConfig对象
        IndexWriterConfig config=new IndexWriterConfig(analyzer);
        //创建IndexWriter对象
        IndexWriter iWriter=new IndexWriter(dir, config);
        //清除之前的索引
        iWriter.deleteAll();
                //创建文档对象
        Document doc=new Document();
        //向文档中添加文本内容字段,及字段类型
        doc.add(new Field("fieldname","坚持到底gl博主的博文,转载请注释出处", TextField.TYPE_STORED));
        //将文档添加到indexWriter中,写入索引文件中
        iWriter.addDocument(doc);
                //关闭写入    
                iWriter.close();        
}

このように実行すると、インデックス内のコンテンツ ファイルが作成されました

次に、インデックスをクエリして、必要な単語を渡してみます。 queried

public static void search(String string) throws Exception {
    
        Directory dir=FSDirectory.open(FileSystems.getDefault().getPath(System.getProperty("user.dir")+"/search"));
        //打开索引目录的
        DirectoryReader dReader=DirectoryReader.open(dir);
        IndexSearcher searcher=new IndexSearcher(dReader);
        //第一个参数 field值 ,第二个参数用户需要检索的字符串
        Term t=new Term("fieldname",string);
        //将用户需要索引的字符串封装成lucene能识别的内容 
        Query query=new TermQuery(t);
        //查询,最大的返回值10
        TopDocs top=searcher.search(query, 10);
                //命中数,那个字段命中,命中的字段有几个
        System.out.println("命中数:"+top.totalHits);
               //查询返回的doc数组
        ScoreDoc[]    sDocs= top.scoreDocs;   
            for (ScoreDoc scoreDoc : sDocs) {
                //输出命中字段内容
        System.out.println(searcher.doc(scoreDoc.doc).get(field));
}
}

こんな感じで、さらに考えてまとめて展開

して追加すると

public static void main(String[] args) throws Exception {
        String chString="坚持到底的文章,转载请注释出处";
        Analyzer analyzer=new IKAnalyzer();
        TokenStream stream=analyzer.tokenStream("word", chString);
        stream.reset();
        CharTermAttribute cta=stream.addAttribute(CharTermAttribute.class);
        while (stream.incrementToken()) {
            System.out.println(cta.toString());
        }
        stream.close();
    }

のようなコードが表示されます。

これらのファイルを追加することもできます。注意すべき点は、エンコード形式に注意する必要があることです。

最初のファイル: ext.dic 拡張辞書、単語分割 グループ化する必要があるファイル: 単語分割処理など。 「最後までやり抜く」という4つの単語を「最後までやり抜く」と「最後までやり続ける」に分けることができます。このファイルに最後までやり抜く力を直接追加すると、最後までやり抜く力の指標を表示することができます

3 番目: stopword.dic は stop 辞書を拡張します。単語の分割に表示したくない場合、または単独で表示したくない場合は、その中に記述することができます。検索時にそこにあります

2 番目: 上記の 2 つを指定します 拡張辞書

これらは、マスターする必要がある最も基本的な内容です。また、拡張する必要がある単語分割アルゴリズムやその他の種類もたくさんあります。

以上がLucene の構成とインデックス作成と全文検索のための画像とテキストコードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。