日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Lucene 全文搜索解析

發(fā)布時(shí)間:2024/7/5 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。