初探Lucene
學習地址:
%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html
新增依賴:
索引基本使用
1.建立索引和搜尋
2.分詞器對比
結果:
分詞技術:class org.apache.lucene.analysis.standard.StandardAnalyzer
今|天|的|生|活|是|因|為|你|三|年|前|的|選|擇|而|今|天|的|選|擇|將|決|定|你|三|年|後|的|生|活|
分詞技術:class org.wltea.analyzer.lucene.IKAnalyzer
今天|的|生活|是因為|因為|你|三年|三|年前|年|前|的|選擇|而今|今天|的|選擇|將|決定|你|三年|三|年後|年|後|的|生活|
分詞技術:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.SimpleAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|
分詞技術:class org.apache.lucene.analysis.cjk.CJKAnalyzer
今天|天的|的生|生活|活是|是因|因為|為你|你三|三年|年前|前的|的選|選擇|而今|今天|天的|的選|選擇|將決|決定|定你|你三|三年|年後|後的|的生|生活|
分詞技術:class org.apache.lucene.analysis.core.KeywordAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.StopAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|
%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623594.html
新增依賴:
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-core</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-queryparser</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-queries</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-highlighter</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-analyzers-smartcn</artifactId>
-
<version>4.3.1</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.lucene</groupId>
-
<artifactId>lucene-analyzers-common</artifactId>
-
<version>4.3.1</version>
- </dependency>
1.建立索引和搜尋
- import java.io.File;
- import java.io.IOException;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.document.Document;
- 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.IndexWriter;
- import org.apache.lucene.index.IndexWriterConfig;
- import org.apache.lucene.index.IndexWriterConfig.OpenMode;
- import org.apache.lucene.queryparser.classic.ParseException;
- import org.apache.lucene.queryparser.classic.QueryParser;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- import org.apache.lucene.util.Version;
- public class Index {
- public static void main(String[] args) {
- Index index = new Index();
- index.createIndex();
- index.search();
- }
- public void createIndex() {
- // 建立一個分詞器(指定Lucene版本)
- Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
- // IndexWriter配置資訊(指定Lucene版本和分詞器)
- IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
- // 設定索引的開啟方式
- indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
- // 建立Directory物件和IndexWriter物件
- Directory directory = null;
- IndexWriter indexWriter = null;
- try {
- directory = FSDirectory.open(new File("Lucene_index/test"));
- // 檢查Directory物件是否處於鎖定狀態(如果鎖定則進行解鎖)
- if (IndexWriter.isLocked(directory)) {
- IndexWriter.unlock(directory);
- }
- indexWriter = new IndexWriter(directory, indexWriterConfig);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 建立測試文件併為其新增域
- Document doc1 = new Document();
- doc1.add(new StringField("id", "abcde", Store.YES)); // 新增一個id域,域值為abcde
- doc1.add(new TextField("content", "使用Lucene實現全文檢索", Store.YES)); // 文字域
- doc1.add(new IntField("num", 1, Store.YES)); // 新增數值域
- // 將文件寫入索引
- try {
- indexWriter.addDocument(doc1);
- } catch (IOException e) {
- e.printStackTrace();
- }
- Document doc2 = new Document();
- doc2.add(new StringField("id", "yes", Store.YES));
- doc2.add(new TextField("content", "Docker容器技術簡介", Store.YES));
- doc2.add(new IntField("num", 2, Store.YES));
- try {
- indexWriter.addDocument(doc2);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 將IndexWriter提交
- try {
- indexWriter.commit();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- indexWriter.close();
- directory.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public void search() {
- Directory directory = null;
- DirectoryReader dReader = null;
- try {
- directory = FSDirectory.open(new File("Lucene_index/test")); // 索引檔案
- dReader = DirectoryReader.open(directory); // 讀取索引檔案
- IndexSearcher searcher = new IndexSearcher(dReader); // 建立IndexSearcher物件
- Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); // 指定分詞技術(標準分詞-與建立索引時使用的分詞技術一致)
- // 建立查詢字串(指定搜尋域和採用的分詞技術)
- QueryParser parser = new QueryParser(Version.LUCENE_43, "content", analyzer);
- Query query = parser.parse("Docker"); // 建立Query物件(指定搜尋詞)
- // 檢索索引(指定前10條)
- TopDocs topDocs = searcher.search(query, 10);
- if (topDocs != null) {
- System.out.println("符合條件的文件總數為:" + topDocs.totalHits);
- for (int i = 0; i < topDocs.scoreDocs.length; i++) {
- Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
- System.out.println(
- "id = " + doc.get("id") + ",content = " + doc.get("content") + ",num = " + doc.get("num"));
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } finally {
- try {
- dReader.close();
- directory.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
2.分詞器對比
- import java.io.IOException;
- import java.io.StringReader;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.cjk.CJKAnalyzer;
- import org.apache.lucene.analysis.core.KeywordAnalyzer;
- import org.apache.lucene.analysis.core.SimpleAnalyzer;
- import org.apache.lucene.analysis.core.StopAnalyzer;
- import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
- import org.apache.lucene.util.Version;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- public class AnalyzerTest {
- public static void main(String[] args) {
- AnalyzerTest test=new AnalyzerTest();
- test.testAnalyzer();
- }
- public void testAnalyzer() {
- final String str = "今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。";
- Analyzer analyzer = null;
- analyzer = new StandardAnalyzer(Version.LUCENE_43); // 標準分詞
- print(analyzer, str);
- analyzer = new IKAnalyzer(); // 第三方中文分詞
- print(analyzer, str);
- analyzer = new WhitespaceAnalyzer(Version.LUCENE_43); // 空格分詞
- print(analyzer, str);
- analyzer = new SimpleAnalyzer(Version.LUCENE_43); // 簡單分詞
- print(analyzer, str);
- analyzer = new CJKAnalyzer(Version.LUCENE_43); // 二分法分詞
- print(analyzer, str);
- analyzer = new KeywordAnalyzer(); // 關鍵字分詞
- print(analyzer, str);
- analyzer = new StopAnalyzer(Version.LUCENE_43); // 被忽略詞分詞器
- print(analyzer, str);
- }
- /**
- * 該方法用於列印分詞器及其分詞結果
- *
- * @param analyzer
- * 分詞器
- * @param str
- * 需要分詞的字串
- */
- public void print(Analyzer analyzer, String str) {
- StringReader stringReader = new StringReader(str);
- try {
- TokenStream tokenStream = analyzer.tokenStream("", stringReader); // 分詞
- tokenStream.reset();
- CharTermAttribute term = tokenStream.getAttribute(CharTermAttribute.class); // 獲取分詞結果的CharTermAttribute
- System.out.println("分詞技術:" + analyzer.getClass());
- while (tokenStream.incrementToken()) {
- System.out.print(term.toString() + "|");
- }
- System.out.println();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
結果:
分詞技術:class org.apache.lucene.analysis.standard.StandardAnalyzer
今|天|的|生|活|是|因|為|你|三|年|前|的|選|擇|而|今|天|的|選|擇|將|決|定|你|三|年|後|的|生|活|
分詞技術:class org.wltea.analyzer.lucene.IKAnalyzer
今天|的|生活|是因為|因為|你|三年|三|年前|年|前|的|選擇|而今|今天|的|選擇|將|決定|你|三年|三|年後|年|後|的|生活|
分詞技術:class org.apache.lucene.analysis.core.WhitespaceAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.SimpleAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|
分詞技術:class org.apache.lucene.analysis.cjk.CJKAnalyzer
今天|天的|的生|生活|活是|是因|因為|為你|你三|三年|年前|前的|的選|選擇|而今|今天|天的|的選|選擇|將決|決定|定你|你三|三年|年後|後的|的生|生活|
分詞技術:class org.apache.lucene.analysis.core.KeywordAnalyzer
今天的生活是因為你三年前的選擇,而今天的選擇,將決定你三年後的生活。|
分詞技術:class org.apache.lucene.analysis.core.StopAnalyzer
今天的生活是因為你三年前的選擇|而今天的選擇|將決定你三年後的生活|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1974653/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Lucene教程
- 【Lucene&&Solr】Lucene索引和搜尋流程Solr索引
- lucene(一) lucene一些概念的理解
- Lucene原始碼解析--Lucene中的CloseableThreadLocal類原始碼thread
- Lucene學習
- lucene第一步,lucene基礎,索引建立索引
- lucene、lucene.NET詳細使用與優化詳解優化
- Lucene學習一
- lucene入門使用
- Lucene查詢原理
- lucene學習總結篇--lucene全文檢索的基本原理和lucene API簡單的使用API
- lucene 總結收集(url)
- lucene 自定義評分
- Lucene 排序 Sort與SortField排序
- Lucene建立索引流程索引
- lucene Filter過濾器Filter過濾器
- lucene字典實現原理
- Lucene五分鐘教程
- Apache Lucene 4釋出Apache
- lucene入門問題
- 網站搜尋功能lucene網站
- Lucene打分公式的推導公式
- Lucene字典的實現原理
- Lucene原始碼解析--Field類原始碼
- spring框架下配置luceneSpring框架
- Lucene.jar的問題JAR
- lucene和NoSQL的結合SQL
- Lucene的分頁查詢
- Lucene學習總結之八:Lucene的查詢語法,JavaCC及QueryParser(1)Java
- Lucene底層原理和最佳化經驗分享(1)-Lucene簡介和索引原理索引
- HanLP中文分詞Lucene外掛HanLP中文分詞
- lucene 多欄位查詢-MultiFieldQueryParser
- Lucene--專案記錄(1)
- lucene關於IndexReader總結Index
- Lucene原始碼解析--Lock檔案原始碼
- 初學lucene,不知從何下手
- 利用Lucene搜尋Java原始碼Java原始碼
- 從根上理解elasticsearch(lucene)查詢原理(2)-lucene常見查詢型別原理分析Elasticsearch型別