Lucene 全文搜索解析
生活随笔
收集整理的這篇文章主要介紹了
Lucene 全文搜索解析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、創(chuàng)建查詢對(duì)象的方式
對(duì)要搜索的信息創(chuàng)建 Query 查詢對(duì)象,Lucene 會(huì)根據(jù) Query 查詢對(duì)象生成最終的查詢語(yǔ)法。類似關(guān)系數(shù)據(jù)庫(kù) Sql 語(yǔ)法一樣,Lucene 也有自己的查詢語(yǔ)法,比如:“name:lucene”表示查詢 Field 的 name 為 “l(fā)ucene” 的文檔信息??赏ㄟ^兩種方法創(chuàng)建查詢對(duì)象:使用 Lucene 提供 Query 子類
Query 是一個(gè)抽象類,lucene 提供了很多查詢對(duì)象,比如 TermQuery 項(xiàng)精確查詢,NumericRangeQuery 數(shù)字范圍查詢等。如下代碼:Query query = new TermQuery(new Term(“name”, “l(fā)ucene”));
使用 QueryParse 解析查詢表達(dá)式
QueryParser 會(huì)將用戶輸入的查詢表達(dá)式解析成 Query 對(duì)象實(shí)例。
如下代碼:QueryParser queryParser = new QueryParser(“name”, new IKAnalyzer());
Query query = queryParser.parse(“name:lucene”);
二、通過 Query 子類搜索
2.1 TermQuery
TermQuery 項(xiàng)查詢,TermQuery 不使用分析器,搜索關(guān)鍵詞作為整體來匹配 Field 域中的詞進(jìn)行查詢,比如訂單號(hào)、分類 ID 號(hào)等。private void doSearch(Query query) {IndexReader reader = null;
try {// a) 指定索引庫(kù)目錄Directory indexdirectory = FSDirectory.open(new File("E:\\11-index\\0720"));// b) 創(chuàng)建IndexReader對(duì)象reader = DirectoryReader.open(indexdirectory);// c) 創(chuàng)建IndexSearcher對(duì)象IndexSearcher searcher = new IndexSearcher(reader);// d) 通過IndexSearcher對(duì)象執(zhí)行查詢索引庫(kù),返回TopDocs對(duì)象// 第一個(gè)參數(shù):查詢對(duì)象// 第二個(gè)參數(shù):最大的n條記錄TopDocs topDocs = searcher.search(query, 10);// e) 提取TopDocs對(duì)象中的文檔ID,如何找出對(duì)應(yīng)的文檔ScoreDoc[] scoreDocs = topDocs.scoreDocs;System.out.println("總共查詢出的結(jié)果總數(shù)為:" + topDocs.totalHits);Document doc;for (ScoreDoc scoreDoc : scoreDocs) {// 文檔對(duì)象IDint docId = scoreDoc.doc;doc = searcher.doc(docId);// f) 輸出文檔內(nèi)容System.out.println(doc.get("filename"));System.out.println(doc.get("path"));System.out.println(doc.get("size"));}
} catch (IOException e) {e.printStackTrace();
} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}
}
}@Test
public void testTermQuery() throws Exception {// 1、 創(chuàng)建查詢(Query對(duì)象)
Query query = new TermQuery(new Term("filename", "apache"));
// 2、 執(zhí)行搜索
doSearch(query);
}
2.2 NumericRangeQuery
NumericRangeQuery,指定數(shù)字范圍查詢.@Test
public void testNumbericRangeQuery() throws Exception {// 創(chuàng)建查詢
// 第一個(gè)參數(shù):域名
// 第二個(gè)參數(shù):最小值
// 第三個(gè)參數(shù):最大值
// 第四個(gè)參數(shù):是否包含最小值
// 第五個(gè)參數(shù):是否包含最大值
Query query = NumericRangeQuery.newLongRange("size", 1l, 100l, true,true);
// 2、 執(zhí)行搜索
doSearch(query);
}
2.3 BooleanQuery
BooleanQuery,布爾查詢,實(shí)現(xiàn)組合條件查詢。@Test
public void booleanQuery() throws Exception {BooleanQuery query = new BooleanQuery();
Query query1 = new TermQuery(new Term("id", "3"));
Query query2 = NumericRangeQuery.newFloatRange("price", 10f, 200f,true, true);//MUST:查詢條件必須滿足,相當(dāng)于AND
//SHOULD:查詢條件可選,相當(dāng)于OR
//MUST_NOT:查詢條件不能滿足,相當(dāng)于NOT非
query.add(query1, Occur.MUST);
query.add(query2, Occur.SHOULD);System.out.println(query);search(query);
}
組合關(guān)系代表的意思如下:1、MUST 和 MUST 表示 “與” 的關(guān)系,即“交集”。
2、MUST 和 MUST_NOT 前者包含后者不包含。
3、MUST_NOT 和 MUST_NOT 沒意義
4、SHOULD 與 MUST 表示 MUST,SHOULD 失去意義;
5、SHOUlD 與 MUST_NOT 相當(dāng)于 MUST 與 MUST_NOT。
6、SHOULD 與 SHOULD 表示 “或” 的概念。
三、通過 QueryParser 搜索
通過 QueryParser 也可以創(chuàng)建 Query,QueryParser 提供一個(gè) Parse 方法,此方法可以直接根據(jù)查詢語(yǔ)法來查詢。Query 對(duì)象執(zhí)行的查詢語(yǔ)法可通過 System.out.println(query); 查詢。3.1 QueryParser
代碼實(shí)現(xiàn):@Test
public void testQueryParser() throws Exception {// 創(chuàng)建QueryParser
// 第一個(gè)參數(shù):默認(rèn)域名
// 第二個(gè)參數(shù):分詞器
QueryParser queryParser = new QueryParser("name", new IKAnalyzer());
// 指定查詢語(yǔ)法 ,如果不指定域,就搜索默認(rèn)的域
Query query = queryParser.parse("lucene");
System.out.println(query);
// 2、 執(zhí)行搜索
doSearch(query);
}
查詢語(yǔ)法:1、基礎(chǔ)的查詢語(yǔ)法,關(guān)鍵詞查詢:域名 +“:”+ 搜索的關(guān)鍵字
例如:content:java
2、范圍查詢域名 +“:”+[最小值 TO 最大值]
例如:size:[1 TO 1000]
注意:QueryParser 不支持對(duì)數(shù)字范圍的搜索,它支持字符串范圍。
數(shù)字范圍搜索建議使用 NumericRangeQuery。
3、組合條件查詢組合條件查詢. PNG
1)+ 條件 1 + 條件 2:兩個(gè)條件之間是并且的關(guān)系 and
例如:+filename:apache +content:apache2)+ 條件 1 條件 2:必須滿足第一個(gè)條件,忽略第二個(gè)條件
例如:+filename:apache content:apache3)條件 1 條件 2:兩個(gè)條件滿足其一即可。
例如:filename:apache content:apache4)- 條件 1 條件 2:必須不滿足條件 1,要滿足條件 2
例如:-filename:apache content:apache第二種寫法:
條件 1 AND 條件 2
條件 1 OR 條件 2
條件 1 NOT 條件 2
3.2 MultiFieldQueryParser
通過 MultiFieldQueryParser 對(duì)多個(gè)域查詢。@Test
public void testMultiFieldQueryParser() throws Exception {// 可以指定默認(rèn)搜索的域是多個(gè)
String[] fields = { "name", "description" };
// 創(chuàng)建一個(gè)MulitFiledQueryParser對(duì)象
QueryParser parser = new MultiFieldQueryParser(fields, new IKAnalyzer());
// 指定查詢語(yǔ)法 ,如果不指定域,就搜索默認(rèn)的域
Query query = parser.parse("lucene");
//等同于name:lucene OR description:lucene
// Query query = parser.parse("name:lucene OR description:lucene");
// 2、 執(zhí)行搜索
doSearch(query);
}
四、TopDocs
Lucene 搜索結(jié)果可通過 TopDocs 遍歷,TopDocs 類提供了少量的屬性,如下:topdocs 屬性. PNG
注意:Search 方法需要指定匹配記錄數(shù)量 n:indexSearcher.search(query, n)
TopDocs.totalHits:是匹配索引庫(kù)中所有記錄的數(shù)量
TopDocs.scoreDocs:匹配相關(guān)度高的前邊記錄數(shù)組,scoreDocs 的長(zhǎng)度小于等于 search 方法指定的參數(shù) n本文作者: IIsKei
本文鏈接: http://www.iskei.cn/posts/3536.html
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協(xié)議。轉(zhuǎn)載請(qǐng)注明出處!
?
轉(zhuǎn)載于:https://www.cnblogs.com/Jeely/p/11224366.html
總結(jié)
以上是生活随笔為你收集整理的Lucene 全文搜索解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github项目汇总
- 下一篇: 剑指Offer——求1+2..+n的和