Lucene-Lucene的Field及其分頁查詢

来源:https://www.cnblogs.com/shoufeng/archive/2018/07/29/9384832.html
-Advertisement-
Play Games

Document(文檔)是Field(域)的承載體, 一個Document由多個Field組成. Field由名稱和值兩部分組成, 值是要索引的內容, 也是要搜索的內容. Lucene在記憶體中實現了分頁查詢, 這裡通過一個分頁查詢的demo演示分頁的過程. ...


目錄

1 Field的特性

Document(文檔)是Field(域)的承載體, 一個Document由多個Field組成. Field由名稱和值兩部分組成, Field的值是要索引的內容, 也是要搜索的內容.

  • 是否分詞(tokenized)

    是: 將Field的值進行分詞處理, 分詞的目的是為了索引. 如: 商品名稱, 商品描述. 這些內容用戶會通過輸入關鍵詞進行查詢, 由於內容多樣, 需要進行分詞處理建立索引.

    否: 不做分詞處理. 如: 訂單編號, 身份證號, 是一個整體, 分詞以後就失去了意義, 故不需要分詞.

  • 是否索引(indexed)

    是: 將Field內容進行分詞處理後得到的詞(或整體Field內容)建立索引, 存儲到索引域. 索引的目的是為了搜索. 如: 商品名稱, 商品描述需要分詞建立索引. 訂單編號, 身份證號作為整體建立索引. 只要可能作為用戶查詢條件的詞, 都需要索引.

    否: 不索引. 如: 商品圖片路徑, 不會作為查詢條件, 不需要建立索引.

  • 是否存儲(stored)

    是: 將Field值保存到Document中. 如: 商品名稱, 商品價格. 凡是將來在搜索結果頁面展現給用戶的內容, 都需要存儲.

    否: 不存儲. 如: 商品描述. 內容多格式大, 不需要直接在搜索結果頁面展現, 不做存儲. 需要的時候可以從關係資料庫取.

2 常用的Field類型

以下是企業項目開發中常用的Field類型:

Field類型 數據類型 是否分詞 是否索引 是否存儲 說明
StringField(FieldName, FieldValue, Store.YES) 字元串 N Y Y/N 字元串類型Field, 不分詞, 作為一個整體進行索引(如: 身份證號, 訂單編號), 是否需要存儲由Store.YES或Store.NO決定
LongField(FieldName, FieldValue, Store.YES) 數值型代表 Y Y Y/N Long數值型Field代表, 分詞並且索引(如: 價格), 是否需要存儲由Store.YES或Store.NO決定
StoredField(FieldName, FieldValue) 重載方法, 支持多種類型 N N Y 構建不同類型的Field, 不分詞, 不索引, 要存儲. (如: 商品圖片路徑)
TextField(FieldName, FieldValue, Store.NO) 文本類型 Y Y Y/N 文本類型Field, 分詞並且索引, 是否需要存儲由Store.YES或Store.NO決定

3 常用的Field種類使用

3.1 準備環境

複製Lucene02-入門程式(Java API的簡單使用)中的lucene-first項目, 修改名稱為lucene-second;

修改pom.xml文件, 將所有的lucene-first修改為lucene-second.

3.2 需求分析

  • 圖書id

    是否分詞: 不需要分詞

    是否索引: 需要索引(這裡可以索引, 也可以不索引)

    是否存儲: 需要存儲

    --> StringField

  • 圖書名稱

    是否分詞: 需要分詞

    是否索引: 需要索引

    是否存儲: 需要存儲

    --> TextField

  • 圖書價格

    是否分詞: 需要分詞(Lucene對數值型的Field, 使用內部分詞)

    是否索引: 需要索引

    是否存儲: 需要存儲

    --> FloatField

  • 圖書圖片

    是否分詞: 不需要分詞

    是否索引: 不需要索引

    是否存儲: 需要存儲

    --> StoredField

  • 圖書描述

    是否分詞: 需要分詞

    是否索引: 需要索引

    是否存儲: 不需要存儲

    --> TextField

3.3 修改代碼

public class IndexManager {
    /**
     * 創建索引功能的測試
     * @throws Exception
     */
    @Test
    public void createIndex() throws IOException{
        // 1. 採集數據
        BookDao bookDao = new BookDaoImpl();
        List<Book> books = bookDao.listAll();
        
        // 2. 創建文檔對象
        List<Document> documents = new ArrayList<Document>();
        for (Book book : books) {
            Document document = new Document();
            // 給文檔對象添加域
            // add方法: 把域添加到文檔對象中, field參數: 要添加的域
            // TextField: 文本域, 屬性name:域的名稱, value:域的值, store:指定是否將域值保存到文檔中

            // 圖書Id --> StringField
            document.add(new StringField("bookId", book.getId() + "", Store.YES));
            // 圖書名稱 --> TextField
            document.add(new TextField("bookName", book.getBookname(), Store.YES));
            // 圖書價格 --> FloatField
            document.add(new FloatField("bookPrice", book.getPrice(), Store.YES));
            // 圖書圖片 --> StoredField
            document.add(new StoredField("bookPic", book.getPic()));
            // 圖書描述 --> TextField
            document.add(new TextField("bookDesc", book.getBookdesc(), Store.NO));

            // 將文檔對象添加到文檔對象集合中
            documents.add(document);
        }
        
        // 3. 創建分析器對象(Analyzer), 用於分詞
        Analyzer analyzer = new StandardAnalyzer();
        
        // 4. 創建索引配置對象(IndexWriterConfig), 用於配置Lucene
        // 參數一:當前使用的Lucene版本, 參數二:分析器
        IndexWriterConfig indexConfig = new IndexWriterConfig(Version.LUCENE_4_10_2, analyzer);
        
        // 5. 創建索引庫目錄位置對象(Directory), 指定索引庫的存儲位置
        File path = new File("/Users/healchow/Documents/index");
        Directory directory = FSDirectory.open(path);
        
        // 6. 創建索引寫入對象(IndexWriter), 將文檔對象寫入索引
        IndexWriter indexWriter = new IndexWriter(directory, indexConfig);
        
        // 7. 使用IndexWriter對象創建索引
        for (Document doc : documents) {
            // addDocement(doc): 將文檔對象寫入索引庫
            indexWriter.addDocument(doc);
        }
        
        // 8. 釋放資源
        indexWriter.close();
    }
}

3.4 重新建立索引

刪除之前建立的索引, 再次建立索引. 打開Luke工具查看索引信息, 可看到圖書圖片不分詞, 故沒有索引, 圖書價格使用了Lucene的內部分詞, 故按照UTF-8解碼後顯示亂碼, 如下圖示:

圖書的描述信息沒有存儲:
圖片

版權聲明

作者: ma_shoufeng(馬瘦風)

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接, 否則博主保留追究法律責任的權利.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 系列目錄 一、安裝MySql 二、安裝並破解Navicat 三、沒有my.in配置文件怎麼辦 四、設置MySql的大小寫敏感 五、重置MySql登陸密碼 這一篇可以說是我的踩坑的血淚史了。。。 MySql在Windows下預設是大小寫不敏感的,當表名中有大寫字母的時候,MySql會直接把它轉化成小寫 ...
  • 本文通過大量圖片來分析和描述分庫、分表以及資料庫分區是怎樣進行的。 1.sharding前的初始數據分佈 在本文中,我打算用高考考生相關信息作為實驗數據。請無視表的欄位是否符合現實,也請無視表的設計是否符合範式。 3張表: 考生表,存放全國所有高考考生信息,假設34個省、(直轄)市、(自治區、特別行 ...
  • if exists(select * from sys.objects where name='存儲過程名稱')drop proc 存儲過程名稱goCREATE proc 存儲過程名稱@tableName varchar(8000), --表名、視圖名@indexCol varchar(50) = ...
  • 占座 ...
  • exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure SELECT * into T_System_Organizati ...
  • 對於許多數據科學家來說,數據操作起始於Pandas或Tidyverse。從理論上看,這個概念沒有錯。畢竟,這是為什麼這些工具首先存在的原因。然而,對於分隔符轉換等簡單任務來說,這些選項通常可能是過於重量級了。 有意掌握命令行應該在每個開發人員的技能鏈上,特別是數據科學家。學習shell中的來龍去脈無 ...
  • 在數據遷徙的時候需要使源和目標資料庫的字元集、版本等信息統一…… 這裡是對一個資料庫的設置,需要在兩邊進行同樣的操作。 SYS@PROD1> select userenv('language') from dual; USERENV('LANGUAGE') AMERICAN_AMERICA.ZHS1 ...
  • 此前在校學習期間,只是知道資料庫很重要,但是並未主動去學習瞭解。現在的學習過程中學了一遍mysql,就簡單的做一個總結吧。 首先記住三個概念: 1.資料庫(Database)是按照數據結構來組織、存儲和管理數據的建立在電腦存儲設備上的倉庫。 2.SQL :結構化查詢語言(Structured Qu ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...