lucene是一個利用java編寫的高性能、全功能的開源文本搜索引擎,支持拼寫、突出、分析和符號化功能。因爲java的跨平臺的特性,基本適用於任何項目。例如:電商、文章站的搜索功能。lucene的入門很簡單,高深部分在於索引生成中的分析、符號化功能。java
索引生成:
mysql
查詢:算法
a) 通用sql
org.apache.lucene.analysis.Analyzer:分析器,主要用於將目標信息分解出關鍵字,而後存放在索引文件中。能夠看做是一個搜索算法,網上有不少開源的分析器。apache
org.apache.lucene.store.Directory:索引存放地址,能夠是內存、也能夠是磁盤文件。性能
org.apache.lucene.document.Document:一個文檔,用來存放不少field.this
b)索引生成搜索引擎
org.apache.lucene.index.IndexWriter:索引生成器,主要的操做類。spa
org.apache.lucene.document.Field:屬性類,每個目標文件都至關於一個屬性類。code
c)查詢:
org.apache.lucene.search.IndexSearcher:搜索器,從索引文件中找到須要的信息。
org.apache.lucene.search.Query:查詢類,主要記錄咱們須要查詢的:field,關鍵字等條件。
org.apache.lucene.search.ScoreDoc:查詢結果索引信息,能夠經過這個信息查詢到目標文件的地址。
// 索引 @Test public void testIndex() throws Exception { Long startTime = System.currentTimeMillis(); // 分析器<用於解析內容,如今有各類各樣的分詞分析器> Analyzer analyzer = new StandardAnalyzer(); // 索引文件 // Directory RAMdirectory = new RAMDirectory();// 內存 // Path path=Paths.get("D:\\project\\test\\lucene");// NIO2的文件系統 Directory FSdirectory = new SimpleFSDirectory(Paths.get("D:\\project\\test\\lucene"));// 文件系統 // 索引生成器 IndexWriterConfig config = new IndexWriterConfig(analyzer);// 配置加入分析器 IndexWriter indexWriter = new IndexWriter(FSdirectory, config);// 文件和配置 // 文檔(一個索引:至關於mysql中的一張表) Document doc1 = new Document(); // 內容 // 索引列一(至關於mysql表中的一列) String text1 = " this is a new index"; doc1.add(new Field("fieldone", text1, TextField.TYPE_STORED)); // 索引列二 String text2 = "this is a two index"; doc1.add(new Field("fieltwo", text2, TextField.TYPE_STORED)); indexWriter.addDocument(doc1); indexWriter.close(); FSdirectory.close(); Long endTime = System.currentTimeMillis(); System.out.println("索引時間:" + (endTime - startTime) + "毫秒"); }
// 查詢 @Test public void testQuery() throws Exception { Long startTime = System.currentTimeMillis(); // 分析器<用於解析內容,如今有各類各樣的分詞分析器> Analyzer analyzer = new StandardAnalyzer(); // 索引文件 // Directory RAMdirectory = new RAMDirectory();// 內存 // Path path=Paths.get("D:\\project\\test\\lucene");// NIO2的文件系統 Directory FSdirectory = new SimpleFSDirectory(Paths.get("D:\\project\\test\\lucene"));// 文件系統 // 查詢器 DirectoryReader ireader = DirectoryReader.open(FSdirectory);// 讀取索引文件 IndexSearcher isearcher = new IndexSearcher(ireader);// 生成查詢器 // 查詢<查詢條件> QueryParser parse = new QueryParser("fieldone", analyzer);// 解析索引列一 Query query = parse.parse("index");// 查詢 text 字段 // 查詢結果 ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs; for (int i = 0; i < hits.length; i++) { Document hitDoc = isearcher.doc(hits[i].doc); System.out.println(hitDoc.get("fieldone")); } Long endTime = System.currentTimeMillis(); System.out.println("索引時間:" + (endTime - startTime) + "毫秒"); }