使用Lucene實(shí)現(xiàn)一個(gè)簡(jiǎn)單的布爾搜索功能
什么是lucene
Lucene是apache軟件基金會(huì)jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開(kāi)放源代碼的全文檢索引擎工具包,但它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語(yǔ)言)。
Lucene是一個(gè)全文搜索框架,而不是應(yīng)用產(chǎn)品。因此它并不像www.baidu.com 或者google Desktop那么拿來(lái)就能用,它只是提供了一種工具讓你能實(shí)現(xiàn)這些產(chǎn)品。
在布爾查詢的對(duì)象中,包含一個(gè)子句的集合,各個(gè)子句間都是如“與”、“或”這樣的布爾邏輯。Lucene中所遇到的各種復(fù)雜查詢,最終都可以表示成布爾型的查詢。下面代碼就是實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的布爾查詢。
package LuceneSearch;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TermQuery;
/**
* 布爾搜索測(cè)試
* @author sdu20
*
*/
public class BooleanQueryTest {
static final String INDEX_STORE_PATH = "E:\\編程局\\Java編程處\\Index\\";
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new StandardAnalyzer(),true);
writer.setUseCompoundFile(false);
//創(chuàng)建8個(gè)文檔
Document doc1 = new Document();
Document doc2 = new Document();
Document doc3 = new Document();
Document doc4 = new Document();
Document doc5 = new Document();
Document doc6 = new Document();
Document doc7 = new Document();
Document doc8 = new Document();
Field f1 = new Field("bookname","鋼鐵是怎樣煉成的",Field.Store.YES,Field.Index.TOKENIZED);
Field f2 = new Field("bookname","英雄兒女",Field.Store.YES,Field.Index.TOKENIZED);
Field f3 = new Field("bookname","浮生六記",Field.Store.YES,Field.Index.TOKENIZED);
Field f4 = new Field("bookname","太平廣記",Field.Store.YES,Field.Index.TOKENIZED);
Field f5 = new Field("bookname","文化苦旅",Field.Store.YES,Field.Index.TOKENIZED);
Field f6 = new Field("bookname","白夜行",Field.Store.YES,Field.Index.TOKENIZED);
Field f7 = new Field("bookname","白毛女",Field.Store.YES,Field.Index.TOKENIZED);
Field f8 = new Field("bookname","子不語(yǔ)",Field.Store.YES,Field.Index.TOKENIZED);
doc1.add(f1);
doc2.add(f2);
doc3.add(f3);
doc4.add(f4);
doc5.add(f5);
doc6.add(f6);
doc7.add(f7);
doc8.add(f8);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.addDocument(doc6);
writer.addDocument(doc7);
writer.addDocument(doc8);
writer.close();
System.out.println("創(chuàng)建索引成功");
IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
//創(chuàng)建兩個(gè)詞條對(duì)象
Term t1 = new Term("bookname","生");
Term t2 = new Term("bookname","記");
TermQuery q1 = new TermQuery(t1);
TermQuery q2 = new TermQuery(t2);
BooleanQuery query = new BooleanQuery();
query.add(q1,BooleanClause.Occur.MUST);
query.add(q2,BooleanClause.Occur.MUST);
Hits hits = searcher.search(query);
for(int i = 0;i<hits.length();i++){
System.out.println(hits.doc(i));
}
System.out.println("搜索成功");
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
}
BooleanClause.Occur類主要有3種表示,即MUST、MUST_NOT和SHOULD。MUST與MUST_NOT不難理解,一看名字就知道是什么意思,而SHOULD是一個(gè)比較特殊的約束,當(dāng)它與MUST聯(lián)用時(shí),它將失去意義。檢索的結(jié)果為MUST子句的檢索結(jié)果。當(dāng)它與MUST_NOT聯(lián)用時(shí),SHOULD的功能就與MUST一樣,就退變?yōu)镸UST和MUST_NOT的查詢結(jié)果。當(dāng)SHOULD與SHOULD聯(lián)用時(shí),它們就表示一種“或”關(guān)系。最終檢索結(jié)果為所有檢索子句的檢索結(jié)果的并集。
上面代碼就是查詢索引中有“生”字和“記”字的文檔,程序運(yùn)行結(jié)果截圖如下

索引目錄文件夾下截圖如下

以上所述是小編給大家介紹的使用Lucene實(shí)現(xiàn)一個(gè)簡(jiǎn)單的布爾搜索功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Mybatis聯(lián)合查詢的實(shí)現(xiàn)方法
本文主要介紹了 Mybatis聯(lián)合查詢的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
SSH框架網(wǎng)上商城項(xiàng)目第18戰(zhàn)之過(guò)濾器實(shí)現(xiàn)購(gòu)物登錄功能的判斷
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第18戰(zhàn):過(guò)濾器實(shí)現(xiàn)購(gòu)物登錄功能的判斷,感興趣的小伙伴們可以參考一下2016-06-06
Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問(wèn)題
這篇文章主要介紹了Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
很多人竟然不知道Java線程池的創(chuàng)建方式有7種
本文主要介紹了很多人竟然不知道Java線程池的創(chuàng)建方式有7種,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
java 1.8 動(dòng)態(tài)代理源碼深度分析
下面小編就為大家?guī)?lái)一篇java 1.8 動(dòng)態(tài)代理源碼深度分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
一學(xué)即會(huì)之JDK版本快速切換方法(2024)
這篇文章主要介紹了一學(xué)即會(huì)之JDK版本快速切換方法,詳細(xì)給大家講解了如何下載、安裝和配置多個(gè)JDK版本,并通過(guò)設(shè)置環(huán)境變量和編寫(xiě)批處理腳本來(lái)切換JDK版本,需要的朋友可以參考下2025-03-03
Java和Ceylon對(duì)象的構(gòu)造和驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了Java和Ceylon對(duì)象的構(gòu)造和驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
idea創(chuàng)建包含多個(gè)springboot module的maven project的方法
這篇文章主要介紹了idea創(chuàng)建包含多個(gè)springboot module的maven project的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot實(shí)戰(zhàn)之處理異常案例詳解
這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)之處理異常案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09

