摘要:序說(shuō)是界的檢索之王,當(dāng)之無(wú)愧。近年來(lái)的火爆登場(chǎng),包括之前的及,其底層都是。簡(jiǎn)單了解,對(duì)使用還是有點(diǎn)幫助的。是當(dāng)前最流行的開(kāi)源大數(shù)據(jù)內(nèi)存計(jì)算框架,采用語(yǔ)言實(shí)現(xiàn),由伯克利大學(xué)實(shí)驗(yàn)室開(kāi)發(fā)并于年開(kāi)源。
序
說(shuō)lucene是Java界的檢索之王,當(dāng)之無(wú)愧。近年來(lái)elasticsearch的火爆登場(chǎng),包括之前的solr及solr cloud,其底層都是lucene。簡(jiǎn)單了解lucene,對(duì)使用elasticsearch還是有點(diǎn)幫助的。本文就簡(jiǎn)單過(guò)一下其簡(jiǎn)單的api使用。
添加依賴索引與檢索 創(chuàng)建索引org.apache.lucene lucene-core 4.6.1 org.apache.lucene lucene-analyzers-common 4.6.1 org.apache.lucene lucene-queryparser 4.6.1 org.apache.lucene lucene-codecs 4.6.1
File indexDir = new File(this.getClass().getClassLoader().getResource("").getFile()); @Test public void createIndex() throws IOException { // Directory index = new RAMDirectory(); Directory index = FSDirectory.open(indexDir); // 0. Specify the analyzer for tokenizing text. // The same analyzer should be used for indexing and searching StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer); // 1. create the index 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(); } private 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); }檢索
@Test public void search() throws IOException { // 2. query String querystr = "lucene"; // the "title" arg specifies the default field to use // when no field is explicitly specified in the query. Query q = null; try { StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); q = new QueryParser(Version.LUCENE_46,"title", analyzer).parse(querystr); } catch (Exception e) { e.printStackTrace(); } // 3. search int hitsPerPage = 10; Directory index = FSDirectory.open(indexDir); 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") + " " + d.get("title")); } // reader can only be closed when there // is no need to access the documents any more. reader.close(); }分詞
對(duì)于搜索來(lái)說(shuō),分詞出現(xiàn)在兩個(gè)地方,一個(gè)是對(duì)用戶輸入的關(guān)鍵詞進(jìn)行分詞,另一個(gè)是在索引文檔時(shí)對(duì)文檔內(nèi)容的分詞。兩個(gè)分詞最好一樣,這樣才可以更好地匹配出來(lái)。
@Test public void cutWords() throws IOException { // StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46); // CJKAnalyzer analyzer = new CJKAnalyzer(Version.LUCENE_46); SimpleAnalyzer analyzer = new SimpleAnalyzer(); String text = "Spark是當(dāng)前最流行的開(kāi)源大數(shù)據(jù)內(nèi)存計(jì)算框架,采用Scala語(yǔ)言實(shí)現(xiàn),由UC伯克利大學(xué)AMPLab實(shí)驗(yàn)室開(kāi)發(fā)并于2010年開(kāi)源。"; TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(text)); CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); try { tokenStream.reset(); while (tokenStream.incrementToken()) { System.out.println(charTermAttribute.toString()); } tokenStream.end(); } finally { tokenStream.close(); analyzer.close(); } }
輸出
spark 是 當(dāng)前 最 流行 的 開(kāi)源 大數(shù) 據(jù) 內(nèi)存 計(jì)算 框架 采用 scala 語(yǔ)言 實(shí)現(xiàn) 由 uc 伯克利 大學(xué) amplab 實(shí)驗(yàn)室 開(kāi)發(fā) 并于 2010 年 開(kāi)源
參考本工程github
lucenetutorial
helloLucene
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65464.html
摘要:系列文章系列一快速入門系列二使用及索引文檔的基本操作系列三查詢及高亮是什么在維基百科的定義是一套用于全文檢索和搜索的開(kāi)放源代碼程序庫(kù),由軟件基金會(huì)支持和提供。全面準(zhǔn)確和快速是衡量全文檢索系統(tǒng)的關(guān)鍵指標(biāo)。結(jié)果列表有相關(guān)度排序。 系列文章: Lucene系列(一)快速入門 Lucene系列(二)luke使用及索引文檔的基本操作 Lucene系列(三)查詢及高亮 Lucene是什么? Luc...
摘要:系列文章系列一快速入門系列二使用及索引文檔的基本操作系列三查詢及高亮入門簡(jiǎn)介地址下載地址是一個(gè)用于搜索引擎的,方便開(kāi)發(fā)和診斷的可視化工具。使用作為其最低級(jí)別的搜索引擎基礎(chǔ)。截止,上述代碼所用的包皆為最新。 系列文章: Lucene系列(一)快速入門 Lucene系列(二)luke使用及索引文檔的基本操作 Lucene系列(三)查詢及高亮 luke入門 簡(jiǎn)介: github地址:http...
摘要:因?yàn)榈古潘饕蚍謾C(jī)制全文檢索原理分詞原理等等,這些都是不會(huì)過(guò)時(shí)的技術(shù)。中,單個(gè)倒排索引文件稱為。其中有一個(gè)文件,記錄了所有的信息,稱為文檔新寫(xiě)入時(shí),會(huì)生成新的。過(guò)程上個(gè)過(guò)程中在文件系統(tǒng)緩存中,會(huì)有意外故障文檔丟失。寫(xiě)入次怕后,清空。 前言 最近 TL 分享了下 《Elasticsearch基礎(chǔ)整理》,蹭著這個(gè)機(jī)會(huì)。寫(xiě)個(gè)小文鞏固下,本文主要講 ES -> Lucene的底層結(jié)構(gòu),然后詳細(xì)...
摘要:極速的查詢速度通過(guò)有限狀態(tài)轉(zhuǎn)換器實(shí)現(xiàn)了用于全文檢索的倒排索引,實(shí)現(xiàn)了用于存儲(chǔ)數(shù)值數(shù)據(jù)和地理位置數(shù)據(jù)的樹(shù),以及用于分析的列存儲(chǔ)。每個(gè)數(shù)據(jù)都被編入了索引。強(qiáng)大的彈性保障硬件故障。檢測(cè)這些故障并確保集群和數(shù)據(jù)的安全性和可用性。 What —— Elasticsearch是什么? Elasticsearch是一個(gè)基于Lucene的搜索服務(wù)器,Elasticsearch也是使用Java編寫(xiě)的,它...
閱讀 1616·2021-11-23 09:51
閱讀 1185·2019-08-30 13:57
閱讀 2268·2019-08-29 13:12
閱讀 2020·2019-08-26 13:57
閱讀 1205·2019-08-26 11:32
閱讀 983·2019-08-23 15:08
閱讀 710·2019-08-23 14:42
閱讀 3091·2019-08-23 11:41