<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 索引庫的添加 ## Field域的屬性 每個Field包含3部分信息:域的名稱,域的類型,域的值。域的值可以是String,Java.io.Reader,TokenStream,可以是byte\[\]字節數組,可以是數字等等,而域的類型則是有IndexableFieldType類表示的,域的名稱就沒什么好說的了。 **是否分析**:是否對域的內容進行分詞處理。前提是我們要對域的內容進行查詢。 **是否索引**:將Field分析后的詞或整個Field值進行索引,只有索引方可搜索到。 比如:商品名稱、商品簡介分析后進行索引,訂單號、身份證號不用分析但也要索引,這些將來都要作為查詢條件。 **是否存儲**:將Field值存儲在文檔中,存儲在文檔中的Field才可以從Document中獲取 比如:商品名稱、訂單號,凡是將來要從Document中獲取的Field都要存儲 **是否存儲的標準:是否要將內容展示給用戶** ![](https://img.kancloud.cn/10/b0/10b0796effbef80f4afffa7bc05e4f01_887x688.png) ## 添加文檔的代碼 ~~~ @Test public void createIndex() throws IOException { //1. 創建一個Director對象,指定索引庫保存的位置 //把索引保存到磁盤 Directory directory = FSDirectory.open(new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/index").toPath()); //2. 基于Directory對象創建建一個IndexWriter對象, IndexWriter對象默認使用的不是ik IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(directory, config); //3. 讀取磁盤上的文件,對應每個文件創建一個文檔對象 File dir = new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/search"); File[] files = dir.listFiles(); for (File f : files) { //取文件名 String fileName = f.getName(); //文件的路徑 String filePath = f.getPath(); String fileContent = FileUtils.readFileToString(f, "utf-8"); //文件的大小 long fileSize = FileUtils.sizeOf(f); //創建Field //參數1: 域的名稱, 參數2: 域的內容, 參數3: 是否存儲 TextField fieldName = new TextField("name", fileName, Field.Store.YES); StoredField fieldPath = new StoredField("path", filePath); TextField fieldContent = new TextField("content", fileContent, Field.Store.YES); LongPoint fieldSizeValue = new LongPoint("size", fileSize); StoredField fieldSizeStore = new StoredField("size", fileSize); //創建文檔對象 Document document = new Document(); //向文檔對象中添加域 document.add(fieldName); document.add(fieldPath); document.add(fieldContent); document.add(fieldSizeValue); document.add(fieldSizeStore); //把文檔對象寫入索引庫 indexWriter.addDocument(document); } //關閉indexWriter對象 indexWriter.close(); } ~~~ # 索引刪除 ## 刪除全部 ~~~ //刪除全部索引 @Test public void deleteAllIndex() throws Exception { IndexWriter indexWriter = getIndexWriter(); //刪除全部索引 indexWriter.deleteAll(); //關閉indexwriter indexWriter.close(); } ~~~ 說明:將索引目錄的索引信息全部刪除,直接徹底刪除,無法恢復。 **此方法慎用!!** ## 指定查詢條件刪除 ~~~ //根據查詢條件刪除索引 @Test public void deleteIndexByQuery() throws Exception { IndexWriter indexWriter = getIndexWriter(); //創建一個查詢條件 Query query = new TermQuery(new Term("filename", "apache")); //根據查詢條件刪除 indexWriter.deleteDocuments(query); //關閉indexwriter indexWriter.close(); } ~~~ # 索引庫修改 原理就是先刪除后添加 ~~~ //修改索引庫 @Test public void updateIndex() throws Exception { IndexWriter indexWriter = getIndexWriter(); //創建一個Document對象 Document document = new Document(); //向document對象中添加域。 //不同的document可以有不同的域,同一個document可以有相同的域。 document.add(new TextField("filename", "要更新的文檔", Field.Store.YES)); document.add(new TextField("content", " Lucene 簡介 Lucene 是一個基于 Java 的全文信息檢索工具包," + "它不是一個完整的搜索應用程序,而是為你的應用程序提供索引和搜索功能。", Field.Store.YES)); indexWriter.updateDocument(new Term("content", "java"), document); //關閉indexWriter indexWriter.close(); } ~~~ # 索引庫查詢 對要搜索的信息創建Query查詢對象,Lucene會根據Query查詢對象生成最終的查詢語法,類似關系數據庫Sql語法一樣Lucene也有自己的查詢語法,比如:“name:lucene”表示查詢Field的name為“lucene”的文檔信息。 可通過兩種方法創建查詢對象: 1. 使用Lucene提供Query子類 2. 使用QueryParse解析查詢表達式 ## TermQuery **根據關鍵詞查詢** **需要指定要查詢的域以及要查詢的關鍵詞** TermQuery,通過項查詢,TermQuery不使用分析器所以建議匹配不分詞的Field域查詢,比如訂單號、分類ID號等。 指定要查詢的域和要查詢的關鍵詞。 ~~~ //使用Termquery查詢 @Test public void testTermQuery() throws Exception { Directory directory = FSDirectory.open(new File("D:\\temp\\index").toPath()); IndexReader indexReader = DirectoryReader.open(directory); IndexSearcher indexSearcher = new IndexSearcher(indexReader); //創建查詢對象 Query query = new TermQuery(new Term("content", "lucene")); //執行查詢 TopDocs topDocs = indexSearcher.search(query, 10); //共查詢到的document個數 System.out.println("查詢結果總數量:" + topDocs.totalHits); //遍歷查詢結果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("filename")); //System.out.println(document.get("content")); System.out.println(document.get("path")); System.out.println(document.get("size")); } //關閉indexreader indexSearcher.getIndexReader().close(); } ~~~ ## 數值范圍查詢 ~~~ @Test public void testRangeQuery() throws Exception { IndexSearcher indexSearcher = getIndexSearcher(); Query query = LongPoint.newRangeQuery("size", 0l, 10000l); printResult(query, indexSearcher); } ~~~ ## 使用queryparser查詢 **可以對要查詢的內容先分詞,然后基于分詞的結果進行查詢** 通過QueryParser也可以創建Query,QueryParser提供一個Parse方法,此方法可以直接根據查詢語法來查詢。 Query對象執行的查詢語法可通過System.out.println(query);查詢。 需要使用到分析器。建議創建索引時使用的分析器和查詢索引時使用的分析器要一致。 需要加入queryParser依賴的jar包。 lucene-queryparser-7.4.0.jar ~~~ @Test public void testQueryParser() throws Exception { IndexSearcher indexSearcher = getIndexSearcher(); //創建queryparser對象 //第一個參數默認搜索的域 //第二個參數就是分析器對象 QueryParser queryParser = new QueryParser("content", new IKAnalyzer()); Query query = queryParser.parse("Lucene是java開發的"); //執行查詢 printResult(query, indexSearcher); } private void printResult(Query query, IndexSearcher indexSearcher) throws Exception { //執行查詢 TopDocs topDocs = indexSearcher.search(query, 10); //共查詢到的document個數 System.out.println("查詢結果總數量:" + topDocs.totalHits); //遍歷查詢結果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("filename")); //System.out.println(document.get("content")); System.out.println(document.get("path")); System.out.println(document.get("size")); } //關閉indexreader indexSearcher.getIndexReader().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>

                              哎呀哎呀视频在线观看