1. 程式人生 > >Lucene的記憶體索引和磁碟索引

Lucene的記憶體索引和磁碟索引

package HelloLucene;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene {

    public static void main(String[] args) throws IOException, ParseException {
        // 0. Specify the analyzer for tokenizing text.
        //    The same analyzer should be used for indexing and searching
        //標準分詞器對中文支援的不夠好
        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);

        // 1. create the index
//        Directory index = new RAMDirectory();
        Directory index=new SimpleFSDirectory(new File("/user/lucene"));

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);

        IndexWriter w = new IndexWriter(index, config);
        addDoc(w, "Lucene in Action", "193398817");
        addDoc(w, "Lucene for Dummies", "55320055Z");
        addDoc(w, "Managing Gigabytes", "55063554A");
        addDoc(w, "The Art of Computer Science", "9900333X");
        w.close();

        // 2. query
        String querystr = args.length > 0 ? args[0] : "Lucene";

        // the "title" arg specifies the default field to use
        // when no field is explicitly specified in the query.
        Query q = null;
        try {
            q = new QueryParser(Version.LUCENE_40, "title", analyzer).parse(querystr);
        } catch (org.apache.lucene.queryparser.classic.ParseException e) {
            e.printStackTrace();
        }

        // 3. search
        int hitsPerPage = 10;
        IndexReader reader = DirectoryReader.open(index);
        IndexSearcher searcher = new IndexSearcher(reader);
        TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true);
        searcher.search(q, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;

        // 4. display results
        System.out.println("Found " + hits.length + " hits.");
        for (int i = 0; i < hits.length; ++i) {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            System.out.println((i + 1) + ". " + d.get("isbn") + "\t" + d.get("title") );
        }
        // reader can only be closed when there
        // is no need to access the documents any more.
        reader.close();
    }

    private static void addDoc(IndexWriter w, String title, String isbn) throws IOException {
        Document doc = new Document();
        doc.add(new TextField("title", title, Field.Store.YES));

        // use a string field for isbn because we don't want it tokenized
        doc.add(new StringField("isbn", isbn, Field.Store.YES));
        w.addDocument(doc);
    }

}

相關推薦

Lucene記憶體索引磁碟索引

package HelloLucene; import java.io.File; import java.io.IOException; import java.text.ParseException; import org.apache.lucene.analysis.standard.StandardA

B-Tree 索引 Hash 索引的對照

blank tree 內存 算法 data 影響 類型 特點 column 對於 B-tree 和 hash 數據結構的理解可以有助於預測不同存儲引擎下使用不同索引的查詢性能的差異。尤其是那些同意你選擇 B-tree 或者 hash 索引的內存存儲引擎。B-Tree 索

非聚集索引聚集索引

每次 方式 possible .com 表數據 alt ons row span 一.非聚集索引(MyISAM的索引方式): 使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址.主鍵索引圖: 輔助索引圖: 主鍵索引和輔助索引沒有本質上的區別,da

MySQL的btree索引hash索引的區別

class 操作 麻煩 關系 進行 特殊性 檢索 www. 創建 MySQL的btree索引和hash索引的區別 ash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO

JS 中數組字符串索引數值索引研究

組成 ava RF 分享 style spa 這樣的 使用字符串 alt   先來看一個問題: var array = []; array["a"] = "hello"; array["b"] = "world"; array["c"] = "yes"; console.

索引有B+索引hash索引,各自的區別

單獨 效率 結構 edi 性能 mil b+樹 ash 避免 Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B+樹索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的IO訪問,那為什麽大家不都用Hash索引而還要使用B+樹索引呢? 1. Has

單列索引聯合索引區別

csdn 搜索 fontsize 添加 lai water 描述 plain 版本 原文鏈接:https://blog.csdn.net/Abysscarry/article/details/80792876 一、聯合索引測試 註:Mysql版本為 5.7.20 我們

普通索引唯一索引的區別、性能差異,以及其他索引簡介

整數 排列 唯一索引 同名 關聯 超過 結果 其它 加載 唯一索引和普通索引使用的結構都是B-tree,執行時間復雜度都是O(log n)。 1、普通索引  普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查

(ainusers原創)Hash索引BTree索引

注: Innodb和myisam預設的索引是Btree索引 Hash索引(類比於拼音查詢漢字)   BTree(類比於偏旁查詢漢字) 區別(瞭解Innodb和myisam主要還應該從區別開始) 1.主要區別在於:Hash不能用於範圍查詢 2.檢索效率遠高於BTree

ORACLE 全域性索引本地索引

Oracle資料庫中,有兩種型別的分割槽索引,全域性索引和本地索引,其中本地索引又可以分為本地字首索引和本地非字首索引。下面就分別看看每種型別的索引各自的特點。   全域性索引以整個表的資料為物件建立索引,索引分割槽中的索引條目既可能是基於相同的鍵值但是來自不同的分割槽,也可能是多

BTREE索引HASH索引,聚集索引非聚集索引

https://www.jianshu.com/p/76530afa13cb https://blog.csdn.net/yifanSJ/article/details/79220044 BTREE索引和HASH索引 1、不同引擎的預設索引 不同的引擎對於索引有不同的支援:Innod

mysql普通索引聯合索引測試

索引就用空間來換取時間 explain學習和引數代表的意思請參考 https://blog.csdn.net/ywdhzxf/article/details/84316712 下面我會用explain 來測試聯合索引和普通索引的作用項, 只測兩個欄位, source和name 有

唯一索引普通索引的區別

一、背景介紹 索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執行查詢時Mysql必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄,表裡面的記錄數量越多,這個操作的代價就越高,如果作為搜尋條件的列上已經建立了索引,mysql無需掃描任何記錄即可迅速得到目標記錄所在的位置。如

普通索引唯一索引的區別

轉自:https://blog.csdn.net/u014071328/article/details/78780683 唯一索引和普通索引使用的結構都是B-tree,執行時間複雜度都是O(log n)。 1、普通索引   普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快

SAP裡主索引二級索引區別

更多內容關注公眾號:SAP Technical 透明表索引有兩種:分別是主索引和二級索引。 主索引是在我們建立表啟用後由系統自動建立的,這個我們不能修改;二級索引可以我們自己建立。 主索引是表的主鍵,二級索引可以根據你自己需要用到表的任何欄位的組合來建立。 在使用二級索引時,WHERE

普通索引唯一索引的選擇

一 查詢過程:普通索引是找到葉子節點,然後再葉子節點中二分法找到那條記錄,然後向後找,找不到就停止,然後回表。 唯一索引是找到一條就不找了,因為是唯一的。效能差別不到。 資料庫查詢記錄,首先是把這條記錄的所在的頁全部載入到記憶體中,16k, 二 更新過程:更新過程普通索引會用change buffer

Mysql (InnoDB引擎)聚集索引輔助索引

聚集索引: InnoDB儲存引擎表是索引組織表,即按照主鍵的順序儲存資料。  聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,樹中的葉子節點存放著表中的行記錄資料,因此,也將聚集索引的葉子節點稱為資料頁;非葉子節點中存放著僅僅是鍵值和指向葉子節

oracle分割槽表中本地索引全域性索引的適用場景

【背景】分割槽表建立好了之後,如果需要最大化分割槽表的效能就需要結合索引的使用,分割槽表有兩種索引:本地索引和全域性索引。既然存在著兩種的索引型別,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的效能的; 本文件通過測試,總結出兩種索引的適合

Spark SQL中使用StringIndexerIndexToString來對字串資訊進行索引索引

簡介 本篇部落格使用Kaggle上的AdultBase資料集:Machine-Learning-Databases 此資料集雖然歷史比較悠久,但是資料格式比較容易處理,而且資訊比較全面,適合資料處理入門。 本篇部落格使用了Spark SQL的相關語句,實現了以下

聯合索引單個索引的區別:

聯合索引和單個索引的區別: 如果我們建立了(area, age,salary)的複合索引,那麼其實相當於建立了: (area,age,salary),(area,age)、(area)三個索引,這被稱為最佳左字首 特性。因此我們在建立複合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。