<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### **1.創建索引的流程** ![](https://box.kancloud.cn/d2ed55648edec1acfd08107161dda914_554x289.png) ### 2.添加依賴 使用Lucene需要添加Lucene的依賴。 ~~~ lucene核心庫 ???lucene-core 查詢解析器 ??????lucene-queryparser 默認分詞器 ?????lucene-analyzers-common IK分詞器 ???????ikanalyzer 高亮顯示 ???????lucene-highlighter ~~~ Maven工程中的依賴添加如下: ~~~ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.igeekhome</groupId> <artifactId>lucene</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- Junit單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!-- lucene核心庫 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.10.2</version> </dependency> <!-- Lucene的查詢解析器 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>4.10.2</version> </dependency> <!-- lucene的默認分詞器庫 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>4.10.2</version> </dependency> <!-- lucene的高亮顯示 --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-highlighter</artifactId> <version>4.10.2</version> </dependency> <!-- IK分詞器 --> <dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> </dependencies> </project> ~~~ ~~~ ////demo1代碼 package com.igeekhome.lucene; import org.apache.lucene.analysis.cn.ChineseAnalyzer; import org.apache.lucene.analysis.core.SimpleAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.*; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.*; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; public class Demo01 { /* 創建索引 */ @Test public void createIndex() throws IOException { //1.創建文檔對象 //Document document = new Document(); //給文檔添加字段 //StringField 默認不分詞 TextField:分詞 //參數:name:字段名 value:字段值 Store:是否存儲 //document.add(new IntField("did",2,Field.Store.YES)); // document.add(new IntField("did",5,Field.Store.YES)); //document.add(new TextField("dtitle","id為2的string類型新的字段",Field.Store.YES)); /*Document document02 = new Document(); //給文檔添加字段 //StringField 默認不分詞 TextField:分詞 //參數:name:字段名 value:字段值 Store:是否存儲 document02.add(new StringField("did","2",Field.Store.YES)); document02.add(new TextField("dtitle","極客營,專業IT培訓100年啊!",Field.Store.YES)); */ //2.創建索引寫入器對象 //2.1 創建索引庫的目錄對象 絕對路徑:D:\indexDir 相對路徑 Directory d = FSDirectory.open(new File("indexDir")); //2.2 索引寫入器配置類對象 IKAnalyzer:中文分詞器 //參數:1.Lucene版本號 2.分詞器對象 IndexWriterConfig cofg = new IndexWriterConfig(Version.LATEST,new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(d,cofg); //3.將文檔寫入索引庫 for(int i = 20;i<25;i++){ Document document = new Document(); document.add(new IntField("did",i,Field.Store.YES)); document.add(new TextField("dtitle","id為"+i+"的新的內容",Field.Store.YES)); indexWriter.addDocument(document); } //indexWriter.addDocument(document); //indexWriter.addDocument(document02); //4.提交 indexWriter.commit(); //5.關閉資源 indexWriter.close(); } /** * 查詢索引 * 1.基本查詢 */ @Test public void searchIndex() throws IOException, ParseException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //創建查詢解析器對象 //參數:1.查詢字段 2.分詞器 QueryParser parser = new QueryParser("dtitle",new IKAnalyzer()); //通過查詢解析器解析查詢條件 Query query = parser.parse("綺"); //執行查詢 并返回查詢結果 //參數:1. 查詢條件 2.每頁條數 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); System.out.println("ID:"+document.get("did")+";Title:"+document.get("dtitle"));//獲取根據文檔字段獲取字段的值 } } /** * 2.詞條(經過全文檢索后所產生的每一個單詞,是不可分割的)查詢 */ @Test public void searchIndex_Term() throws IOException, ParseException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //通過詞條查詢對象 Query query = new TermQuery(new Term("dtitle","張雨綺"));//參數:1.查詢字段 2.查詢詞條 //執行查詢 并返回查詢結果 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); System.out.println("ID:"+document.get("did")+";Title:"+document.get("dtitle"));//獲取根據文檔字段獲取字段的值 } } /** * 封裝查詢方法 */ public void searchIndex_Basic(Query query) throws IOException, ParseException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //執行查詢 并返回查詢結果 TopDocs topDocs = indexSearcher.search(query, 20); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); System.out.println("ID:"+document.get("did")+";Title:"+document.get("dtitle"));//獲取根據文檔字段獲取字段的值 } } /** * 3.通配符查詢 * * 任意數量字符 * ? 單個字符 */ @Test public void searchIndex_WildCard() throws IOException, ParseException { //創建通配符查詢條件 Query query = new WildcardQuery(new Term("dtitle","??綺")); searchIndex_Basic(query); } /** * 4.模糊查詢 * * 編輯距離:由錯誤的字符串改成正確的字符串需要修改的字符的數量 * * 一般情況下,默認最大編輯距離2,也可以修改默認的最大編輯距離 */ @Test public void searchIndex_Fuzzy() throws IOException, ParseException { //創建通配符查詢條件 Query query = new FuzzyQuery(new Term("dtitle","長江器號"),1); searchIndex_Basic(query); } /** * 5.數值范圍查詢 */ @Test public void searchIndex_NumberRange() throws IOException, ParseException { //創建查詢條件 查詢id 在 2-4之間的數據 //參數:1.查詢字段 2.范圍最小值 3.范圍最大值 4.是否包含最小值 5.是否包含最大值 Query query = NumericRangeQuery.newIntRange("did",2,4,true,true); searchIndex_Basic(query); } /** * 6.布爾查詢 組合查詢 * 本身是沒有查詢條件的,主要是為了整合、組合其他查詢條件 */ @Test public void searchIndex_Boolean() throws IOException, ParseException { //創建查詢條件 查詢id 在 2-4之間的數據 //參數:1.查詢字段 2.范圍最小值 3.范圍最大值 4.是否包含最小值 5.是否包含最大值 Query query01 = NumericRangeQuery.newIntRange("did",2,10,true,true); Query query02 = NumericRangeQuery.newIntRange("did",5,16,true,true); //searchIndex_Basic(query); BooleanQuery booleanQuery = new BooleanQuery(); //參數: 1. 查詢條件 2.組合條件 Occur.MUST 必須滿足 Occur.SHOULD Occur.MUST_NOT /*booleanQuery.add(query01,BooleanClause.Occur.MUST); booleanQuery.add(query02,BooleanClause.Occur.MUST); 交集*/ /*booleanQuery.add(query01,BooleanClause.Occur.SHOULD); booleanQuery.add(query02,BooleanClause.Occur.SHOULD); 并集*/ booleanQuery.add(query01,BooleanClause.Occur.MUST); booleanQuery.add(query02,BooleanClause.Occur.MUST_NOT);//差集 searchIndex_Basic(booleanQuery); } /* * 更新索引 * */ @Test public void updateIndex() throws IOException { //需要更新的文檔 Document document = new Document(); document.add(new IntField("did",1,Field.Store.YES)); document.add(new TextField("dtitle","這是id為1的新的字段",Field.Store.YES)); Directory d = FSDirectory.open(new File("indexDir")); //2.2 索引寫入器配置類對象 IKAnalyzer:中文分詞器 //參數:1.Lucene版本號 2.分詞器對象 IndexWriterConfig cofg = new IndexWriterConfig(Version.LATEST,new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(d,cofg); //參數:1.詞條對象(更新條件) 2.需要更新的文檔 indexWriter.updateDocument(new Term("did","1"),document); indexWriter.commit(); indexWriter.close(); } /* * 刪除索引 * */ @Test public void deleteIndex() throws IOException { Directory d = FSDirectory.open(new File("indexDir")); //2.2 索引寫入器配置類對象 IKAnalyzer:中文分詞器 //參數:1.Lucene版本號 2.分詞器對象 IndexWriterConfig cofg = new IndexWriterConfig(Version.LATEST,new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(d,cofg); //刪除dtitle中包含“新” //根據詞條進行刪除 //indexWriter.deleteDocuments(new Term("dtitle","新")); //刪除id為2的索引 //indexWriter.deleteDocuments(new Term("did","2")); indexWriter.deleteDocuments(NumericRangeQuery.newIntRange("did",2,2,true,true)); indexWriter.commit(); indexWriter.close(); } } ~~~ ~~~ //demo2 package com.igeekhome.lucene; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.IntField; 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.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.*; import org.apache.lucene.search.highlight.*; import org.apache.lucene.search.highlight.Scorer; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; public class Demo02 { /*高亮*/ @Test public void highlighter() throws IOException, ParseException, InvalidTokenOffsetsException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //創建查詢解析器對象 //參數:1.查詢字段 2.分詞器 QueryParser parser = new QueryParser("dtitle",new IKAnalyzer()); //通過查詢解析器解析查詢條件 Query query = parser.parse("新"); //高亮格式化對象 并設置前綴后綴 Formatter formatter = new SimpleHTMLFormatter("<em style='color:red'>","</em>"); //得分對象 Scorer scorer = new QueryScorer(query,"dtitle"); //創建高亮工具 Highlighter highlighter = new Highlighter(formatter,scorer); //執行查詢 并返回查詢結果 //參數:1. 查詢條件 2.每頁條數 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); String title = document.get("dtitle"); //獲取高亮字段的值 String h_title = highlighter.getBestFragment(new IKAnalyzer(), "dtitle", title); System.out.println("ID:"+document.get("did")+";Title:"+h_title);//獲取根據文檔字段獲取字段的值 } } /*排序*/ @Test public void sort() throws IOException, ParseException, InvalidTokenOffsetsException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //創建查詢解析器對象 //參數:1.查詢字段 2.分詞器 QueryParser parser = new QueryParser("dtitle",new IKAnalyzer()); //通過查詢解析器解析查詢條件 Query query = parser.parse("新"); //SortField 排序字段 參數:1.需要排序的字段 2.該字段的類型 3.默認是升序 如果需要降序 則為true Sort sort = new Sort(new SortField("did",SortField.Type.INT,true)); //執行查詢 并返回查詢結果 //參數:1. 查詢條件 2.每頁條數 3.排序對象 TopDocs topDocs = indexSearcher.search(query,10,sort); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); String title = document.get("dtitle"); System.out.println("ID:"+document.get("did")+";Title:"+title);//獲取根據文檔字段獲取字段的值 } } /*分頁*/ /*排序*/ @Test public void page() throws IOException, ParseException, InvalidTokenOffsetsException { int page = 4;//當前頁 int nums = 10;//每頁條數 int start = (page-1)*nums; int end = start+nums; //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //創建查詢解析器對象 //參數:1.查詢字段 2.分詞器 QueryParser parser = new QueryParser("dtitle",new IKAnalyzer()); //通過查詢解析器解析查詢條件 Query query = parser.parse("內容"); //SortField 排序字段 參數:1.需要排序的字段 2.該字段的類型 3.默認是升序 如果需要降序 則為true Sort sort = new Sort(new SortField("did",SortField.Type.INT,true)); //執行查詢 并返回查詢結果 //參數:1. 查詢條件 2.每頁條數 3.排序對象 TopDocs topDocs = indexSearcher.search(query,end,sort); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; //for(ScoreDoc scoreDoc : scoreDocs){ for(int i = start;i<end;i++){ if(i>=scoreDocs.length){ break; } int docId = scoreDocs[i].doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); String title = document.get("dtitle"); System.out.println("ID:"+document.get("did")+";Title:"+title);//獲取根據文檔字段獲取字段的值 } } /*權重*/ @Test public void boost() throws IOException, ParseException, InvalidTokenOffsetsException { //創建索引庫目錄對象 Directory d = FSDirectory.open(new File("indexDir")); //創建索引讀取對象 IndexReader reader = DirectoryReader.open(d); //創建索引查詢對象 IndexSearcher indexSearcher = new IndexSearcher(reader); //創建查詢解析器對象 //參數:1.查詢字段 2.分詞器 QueryParser parser = new QueryParser("dtitle",new IKAnalyzer()); //通過查詢解析器解析查詢條件 Query query = parser.parse("新"); //執行查詢 并返回查詢結果 //參數:1. 查詢條件 2.每頁條數 3.排序對象 TopDocs topDocs = indexSearcher.search(query,10); System.out.println("共查詢出"+topDocs.totalHits+"條數據;"); // 獲取文檔得分數組 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for(ScoreDoc scoreDoc : scoreDocs){ int docId = scoreDoc.doc;//獲取文檔的id 索引下標 //根據文檔id獲取文檔對象 Document document = reader.document(docId); String title = document.get("dtitle"); System.out.println("ID:"+document.get("did")+";Title:"+title);//獲取根據文檔字段獲取字段的值 } } /* 創建索引 */ @Test public void createIndex() throws IOException { //2.創建索引寫入器對象 //2.1 創建索引庫的目錄對象 絕對路徑:D:\indexDir 相對路徑 Directory d = FSDirectory.open(new File("indexDir")); //2.2 索引寫入器配置類對象 IKAnalyzer:中文分詞器 //參數:1.Lucene版本號 2.分詞器對象 IndexWriterConfig cofg = new IndexWriterConfig(Version.LATEST,new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(d,cofg); Document document = new Document(); document.add(new IntField("did",100,Field.Store.YES)); //設置權重 讓查詢結果靠前 默認每個字段權重都是1 TextField textField = new TextField("dtitle", "id為100的新的內容", Field.Store.YES); textField.setBoost(2);//設置權重 默認是1 document.add(textField); indexWriter.addDocument(document); //4.提交 indexWriter.commit(); //5.關閉資源 indexWriter.close(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看