1. 程式人生 > >SSM整合Lucene實現全文檢索

SSM整合Lucene實現全文檢索

1.Lucene概述

Lucene是一款使用Java語言編寫的全文檢索框架

Lucene是簡單而功能強大的基於Java的搜尋庫。它可以用於任何應用程式來搜尋功能。 Lucene是開源專案。它是可擴充套件的,高效能的庫用於索引和搜尋幾乎任何型別的文字。 Lucene庫提供了所需的任何搜尋應用程式的核心業務。索引和搜尋。

搜尋應用程式的工作原理

  • 任何搜尋應用程式執行一些或全部下列操作:
步驟標題描述
1獲取原始內容任何搜尋應用程式的第一個步驟是收集在其上的搜尋是要進行的目標內容
2構建文件下一步是建立從原始內容的搜尋應用程式可以理解和容易理解的檔案
3分析文件在索引過程啟動,該檔案是要分析作為其文字部分是一個候選索引。這個過程被稱為分析文件
4索引檔案一旦文件被構建和分析,下一步是將索引它們使得該檔案可被檢索

Lucene基本元件

元件描述
IndexWriter

此類充當創造/在索引過程中更新指標的核心組成部分

Directory

此類表示索引的儲存位置。子類:FSDirectory,RAMDirectory

Document

Document代表一個虛擬文件與欄位,其中欄位是可包含在物理文件的內容,元資料等物件。Analyzer只能理解文件。

Field

Field是最低單元或索引過程的起點。它代表其中一個鍵被用於識別要被索引的值的鍵值對關係。用於表示一個檔案內容的欄位將具有鍵為“內容”,值可以包含文字或文件的數字內容的部分或全部。 Lucene能索引僅文字或僅數字內容。子類:StringField,BinaryDocValuesField, DoubleField, FloatField, IntField, LongField等

IndexSearcher

這個類充當讀取/搜尋索引的過程後建立索引的核心組成部分。它需要目錄例項指向包含索引的位置

Term

這個類是搜尋的最低單位。它是在索引過程中類似欄位 Field

Query

Query是一個抽象類,包含各種實用方法,所有型別查詢的父在Lucene的搜尋過程中使用

TopDocs

TopDocs指向相匹配的搜尋條件的前N個搜尋結果。它是指標的簡單容器指向它們的搜尋結果輸出的文件。

Analyzer

Analyzer類負責分析一個檔案,並從將被索引的文字獲取令牌/字。不加分析完成後,IndexWriter不能建立索引。

2.配置檔案applicationContext-Lucene.xml的編寫

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

   <!-- IKAnalyzer 分詞器-->
   <bean id="luceneAnalyzer" class="org.wltea.analyzer.lucene.IKAnalyzer"/>

   <!-- SimpleFSDirectory 硬碟索引庫目錄 -->
   <bean id="path" class="java.io.File">
      <constructor-arg value="D:/data/Lucene"/>
   </bean>
   <bean id="luceneDirectory" class="org.apache.lucene.store.SimpleFSDirectory" >
      <constructor-arg name="path" ref="path"/>
   </bean>

   <!-- IndexWriterConfig 用於構建IndexWriter-->
   <bean id="indexWriterConfig" class="org.apache.lucene.index.IndexWriterConfig">
      <constructor-arg name="matchVersion" value="LUCENE_44"/>
      <constructor-arg name="analyzer" ref="luceneAnalyzer"/>
   </bean>

   <!--IndexWriter 用於進行索引寫操作-->
   <bean id="indexWriter" class="org.apache.lucene.index.IndexWriter" >
      <constructor-arg ref="luceneDirectory" />
      <constructor-arg ref="indexWriterConfig" />
   </bean>
</beans>

3.Lucene的各種操作的使用示例

(1)工具類LuceneUtil

注 :Spring管理的元件中無需使用,可直採用註解方式自動注入
public class LuceneUtil {
    private static Directory directory_sp = null;

    private static IndexWriterConfig config = null;

    private static Version matchVersion = null;

    private static Analyzer analyzer = null;

    private static Directory ramDirectory = null;

    /**單例**/
    private static IndexWriter indexWriter;


    static {
        try {
            directory_sp = FSDirectory.open(new File(LuceneConstant.INDEXURL_ALL));
            matchVersion = Version.LUCENE_44;
            analyzer = new IKAnalyzer();
            config = new IndexWriterConfig(matchVersion, analyzer);
            System.out.println("directory_sp    " + directory_sp);
            //建立記憶體索引庫
            ramDirectory = new RAMDirectory(directory_sp, null);
            //建立indexWriter物件
            indexWriter=new IndexWriter(directory_sp, config);
            /**噹噹前執行緒結束時,自動關閉IndexWriter,使用Runtime物件*/
            Runtime.getRuntime().addShutdownHook(new Thread(){
                @Override
                public void run() {
                    try {
                        indexWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /*
     * 返回用於操作索引的物件
     * */
    public static IndexWriter getIndexWriter(){
        return indexWriter;
    }


    /*
     * 返回用於讀取索引的物件
     * */
    public static IndexSearcher getIndexSearcher() throws IOException {

        IndexReader indexReader = DirectoryReader.open(ramDirectory);

        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        return indexSearcher;
    }

    /*
     * 獲取lucene當前的版本
     * */
    public static Version getMatchVersion() {
        return matchVersion;
    }

    /*
     * 獲取分詞器
     * */
    public static Analyzer getAnalyzer() {
        return analyzer;
    }

}

(2)獲取IndexWriter例項

FSDirectory directory= FSDirectory.open(new File("D:/data/lucene_test/test003"));
IKAnalyzer ikAnalyzer=new IKAnalyzer();
IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_44,ikAnalyzer);
RAMDirectory ramDirectory=new RAMDirectory(directory,null);

IndexWriter writer=new IndexWriter(directory,config);

(3)向索引庫中新增資料

IndexWriter indexWriter = LuceneUtil.getIndexWriter();

//(1)建立文件
Document document = new Document();
//(2)建立欄位
StringField idfield = new StringField("id", "4", Field.Store.YES);
TextField goodNamefield = new TextField("goodName", "商品4",Field.Store.YES);
//(3)新增欄位到文件
document.add(idfield);
document.add(goodNamefield);
//(4)新增文件到索引庫
indexWriter.addDocument(document);

indexWriter.commit();
indexWriter.close();

(4)從索引庫中檢索資料

Lucene的查詢方式很 豐富,對於數值型別的資料,採取TermRangeQuery的方式,對於String型別的,就可以採取TermQuery等,查詢方式了,可以通過採取合適的查詢方式,檢索到資料。Queryparser這個查詢方式包含了其他幾種查詢方式。

查詢方式意義
TermQuery精確查詢
TermRangeQuery查詢一個範圍
PrefixQuery字首匹配查詢
WildcardQuery萬用字元查詢
BooleanQuery多條件查詢
PhraseQuery短語查詢
FuzzyQuery模糊查詢
NumericRangeQuery數值範圍查詢
Queryparser萬能查詢(上面的都可以用這個來查詢到)

1.簡單檢索

    //(1)獲取IndexReader物件
    IndexReader indexReader=DirectoryReader.open(FSDirectory.open(new File(LuceneConstant.INDEXURL_ALL)));
    //(2)獲取IndexSearcher物件
    IndexSearcher indexSearcher=new IndexSearcher(indexReader);
    //(3)建立Query物件
    QueryParser queryParser=new QueryParser(LuceneUtil.getMatchVersion(),"goodName",LuceneUtil.getAnalyzer());
    //(4)封裝查詢條件
    Query query=queryParser.parse("商品");
    //(5)使用IndexSearcher物件進行檢索,得到結果文件
    TopDocs topDocs = indexSearcher.search(query, 10);
    //(6)進行結果處理
    for (ScoreDoc scoreDoc:topDocs.scoreDocs){
        Document doc = indexSearcher.doc(scoreDoc.doc);
        System.out.println(doc.get("id")+doc.get("goodName"));
    }

2.萬用字元檢索(WildcardQuery)

    //(1)獲取IndexSearcher物件
    IndexSearcher indexSearcher = LuceneUtil.getIndexSearcher();
    //(2)建立Quary物件,獲取查詢條件
    String name="ORF全長";
    Query query=new WildcardQuery(new Term("name","*"+name+"*"));
    long start=System.currentTimeMillis();
    //(3)進行結果集處理
    TopDocs topDocs = indexSearcher.search(query, 200);
    int num=1;
    for (ScoreDoc sdoc:topDocs.scoreDocs){
        Document doc = indexSearcher.doc(sdoc.doc);
        Globalkit globalkit=new Globalkit();
        globalkit.setId(doc.get("id"));
        globalkit.setName(doc.get("name"));
        globalkit.setCompany(doc.get("company"));
        globalkit.setAlias(doc.get("alias"));
        globalkit.setNumber(doc.get("number"));
        globalkit.setPrice(doc.get("price"));
        System.out.println(globalkit+"--第"+num);
        num++;
    }
    long end=System.currentTimeMillis();
    System.out.println("檢索時間:"+(end-start)+"ms");
}

3.多條件查詢(BooleanQuery,WildcardQuery,NumericRangeQuery)

    //(1)建立IndexSearcher例項
    IndexSearcher indexSearcher=LuceneUtil.getIndexSearcherOfSP();
    String name="ORF全長";
    //(2)建立booleanQuery例項
    BooleanQuery booleanQuery=new BooleanQuery();

    //(3)建立Query物件封裝條件
    WildcardQuery query1=new WildcardQuery(new Term("name","*"+name+"*"));
    NumericRangeQuery query2=NumericRangeQuery.newDoubleRange("price",0.0,1000.0,true,true);
    booleanQuery.add(query1,BooleanClause.Occur.MUST);
    booleanQuery.add(query2,BooleanClause.Occur.MUST);

    //(4)檢索
    long start=System.currentTimeMillis();
    TopDocs topDocs = indexSearcher.search(booleanQuery, 200);
    //int num=1;
    for (ScoreDoc sdoc:topDocs.scoreDocs){
        Document doc = indexSearcher.doc(sdoc.doc);
        Globalkit globalkit=new Globalkit();
        globalkit.setId(doc.get("id"));
        globalkit.setName(doc.get("name"));
        globalkit.setCompany(doc.get("company"));
        globalkit.setAlias(doc.get("alias"));
        globalkit.setNumber(doc.get("number"));
        globalkit.setPrice(doc.get("price"));
        //System.out.println(globalkit+"--第"+num);
        //num++;
    }
    long end=System.currentTimeMillis();
    System.out.println("檢索時間:"+(end-start)+"ms");

4.查詢結果設定高亮(使用IK分詞器只能對中文進行分詞、高亮)

注意:

  • 使用中文分詞器無法對英文加高亮
  • 使用英文分詞器無法對中文加高亮
  • 中英混合無法高亮

    
                
               

    相關推薦

    SSM整合Lucene實現全文檢索

    1.Lucene概述Lucene是一款使用Java語言編寫的全文檢索框架Lucene是簡單而功能強大的基於Java的搜尋庫。它可以用於任何應用程式來搜尋功能。 Lucene是開源專案。它是可擴充套件的,高效能的庫用於索引和搜尋幾乎任何型別的文字。 Lucene庫提供了所需的任

    SpringCloud學習筆記024---SpringBoot整合Lucene實現全文檢索_分詞_索引_更新_刪除文件_詞條搜尋_多條件查詢

    先看程式碼實現,下面有lucene介紹: 測試用例 Github 程式碼 程式碼我已放到 Github ,匯入spring-boot-lucene-demo 專案 新增依賴 <!--對分詞索引查詢解析--> <dependency>

    Lucene實現全文檢索

    1.配置開發壞境 1.1.下載Lucene(http://lucene.apache.org/ ) jdk要求 1.8 以上 1.2.匯入jar包 下載完之後解壓裡面有所需Jar包 2. 編寫入門案列 2.1建立索引 2.2 查詢索引 2.3 中文分析

    springboot+elasticsearch + rabbitMQ實現全文檢索(springboot+ES整合

    known https vnr builder mod hystrix connector uid bsp springboot 2.X 能用 springboot-data-ES 5.X的 用特殊方式引入 5.X的ES 配置 bootstrap.xml 因為在調試,所

    使用Lucene.Net實現全文檢索

    目錄 一 Lucene.NET概述 二 分詞 三 索引 四 搜尋 五 實踐中的問題 一 Lucene.Net概述   Lucene.Net是一個C#開發的開源全文索引庫,其原始碼包括“核心”與“外圍”兩部分。外圍部分實現輔

    lucene教程--全文檢索技術

    bss bsp 詳細 .cn 總結 bbs 實例demo 技術 .net 1 Lucene 示例代碼 https://blog.csdn.net/qzqanzc/article/details/80916430 2 Lucene 4.7 學習及實例

    Lucene全文檢索

    介紹 Lucene是一個開放原始碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎。 A)什麼是索引庫 索引庫是Lucene的一個重要的儲存結構,它包括二部份:原始記錄表(value),詞彙/關

    SSM整合實現全部使用者查詢)

    準備 1、建立工程(我建立了一個maven工程) 2、pom檔案匯入依賴: https://blog.csdn.net/qq_43154385/article/details/84308826 3、工程結構 程式碼 mybatis-config.xml(SqlMapCo

    lucene框架全文檢索搜尋引擎方案

    搜尋引擎技術方案 搜尋引擎方案 功能需求背景: ----有搜尋引擎需求   功能需求 提高查詢效率,關鍵詞全文檢索。 不需要訪問多次資料庫,只能一次資料庫查詢。 準確關鍵詞全文檢索。 由於查詢功能效

    實戰2000W條資料實現全文檢索

    一) 前期準備測試: 舊版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的欄位上。 不過新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具體資訊要隨時關注官網,下載mySql5.7 直接使用,可

    javaEE Lucene全文檢索,站內搜尋,入門程式。索引庫的新增

    注意:搜尋使用的分析器(分詞器)要和建立索引時使用的分析器一致。 Field類(域物件): Test.java(入門程式 測試類): package com.xxx.lucene; import static org.junit.Assert.*; im

    springboot+elasticsearch + rabbitMQ實現全文檢索(專案搭建)

    最近做一個社群類的專案:實現全文檢索 開發完成做一個總結記錄。 spring-boot-1.5.9.RELEASE ES 5.6.4 首先搭建ES環境 引用大佬文章 搭建ES環境: https://blog.csdn.net/u012270682/article/details/7293

    springboot+elasticsearch + rabbitMQ實現全文檢索(項目搭建)

    runt mage ans log 127.0.0.1 改變 引用 復制 ping 最近做一個社區類的項目:實現全文檢索 開發完成做一個總結記錄。 spring-boot-1.5.9.RELEASE ES 5.6.4 首先搭建ES環境 引用大佬文章 搭建ES環境: http

    使用Lucene進行全文檢索(二)---得到有效的內容(轉載)

    在使用lucene對相關內容進行索引時,會遇到各種格式的內容,例如html,pdf,word等等,那麼我們如何從這麼文件中得到我們需要的內容哪?例如html的內容,一般我們不需要對html標籤建立索引,因為那不是我們需要搜尋的內容.這個時候,我們就需要從html內容中解析

    Elasticsearch使用REST API實現全文檢索

    通過rest api新增檢索資料,閱讀官方文件可以發現,elasticsearch支援動態對映,但是其中有不少問題,且聽慢慢詳解。 本文主要講述三點內容: 1 Elasticsearch常用的rest api 2 Elasticsearch使用bulk命令新增索引資料 ES REST API

    java springboot 結合elasticsearch 實現全文檢索 的步驟,有坑請繞行

    開啟springboot專案 首先我這裡選擇的是jestClient操作elasticsearch 這裡還有一種方式是通過 ElasticsearchRepostiry類似jpa的一種工具介面,但會隨著ela的版本的修改而變化程式碼,所以首選jestClient

    Lucene全文檢索的流程

    一、索引和搜尋流程圖 1、綠色表示索引過程,對要搜尋的原始內容進行索引構建一個索引庫,索引過程包括: 確定原始內容即要搜尋的內容-----採集文件-----建立文件-----分析文件-----索引文件 2、紅色表示搜尋過程,從索引庫中搜索內容,搜尋過程包括: 使用者通過搜尋介面---

    Lucene全文檢索

    一、資料庫搜尋 資料庫中的搜尋很容易實現,通常都是使用sql語句進行查詢,而且能很快的得到查詢結果。 為什麼資料庫搜尋很容易?因為資料庫中的資料儲存是有規律的,有行有列而且資料格式、資料長度都是固定的。 二、資料分類 我們生活中的資料總體分為兩種:結構化資料和非結構化資料。 結構

    Lucene開源全文檢索引擎快速入門

    Lucene是一個用Java開發的開源全文檢索引擎,官網是:http://lucene.apache.org/ ,Lucene不是一個完整的全文索引應用(與之對應的是solr),而是是一個用Java寫的全文索引引擎工具包,它可以方便的嵌入到各種應用中實現針對應用的全文索引/檢索功能,更多

    elasticsearch的實現全文檢索

    elasticsearch一個準實時的搜尋引擎,基於lucene構建,它的主要強項還是在全文檢索方面。工作中還是使用到了這部分功能,這裡做一個簡單的總結,可以使初次使用的人很快的配置和使用。 一、全文檢索的概念 首先介紹全文檢索的概念,就是對一篇文章進行索