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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lucene 全文搜索解析

發布時間:2024/7/5 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucene 全文搜索解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、創建查詢對象的方式 對要搜索的信息創建 Query 查詢對象,Lucene 會根據 Query 查詢對象生成最終的查詢語法。類似關系數據庫 Sql 語法一樣,Lucene 也有自己的查詢語法,比如:“name:lucene”表示查詢 Field 的 name 為 “lucene” 的文檔信息。可通過兩種方法創建查詢對象:使用 Lucene 提供 Query 子類 Query 是一個抽象類,lucene 提供了很多查詢對象,比如 TermQuery 項精確查詢,NumericRangeQuery 數字范圍查詢等。如下代碼:Query query = new TermQuery(new Term(“name”, “lucene”)); 使用 QueryParse 解析查詢表達式 QueryParser 會將用戶輸入的查詢表達式解析成 Query 對象實例。 如下代碼:QueryParser queryParser = new QueryParser(“name”, new IKAnalyzer()); Query query = queryParser.parse(“name:lucene”); 二、通過 Query 子類搜索 2.1 TermQuery TermQuery 項查詢,TermQuery 不使用分析器,搜索關鍵詞作為整體來匹配 Field 域中的詞進行查詢,比如訂單號、分類 ID 號等。private void doSearch(Query query) {IndexReader reader = null; try {// a) 指定索引庫目錄Directory indexdirectory = FSDirectory.open(new File("E:\\11-index\\0720"));// b) 創建IndexReader對象reader = DirectoryReader.open(indexdirectory);// c) 創建IndexSearcher對象IndexSearcher searcher = new IndexSearcher(reader);// d) 通過IndexSearcher對象執行查詢索引庫,返回TopDocs對象// 第一個參數:查詢對象// 第二個參數:最大的n條記錄TopDocs topDocs = searcher.search(query, 10);// e) 提取TopDocs對象中的文檔ID,如何找出對應的文檔ScoreDoc[] scoreDocs = topDocs.scoreDocs;System.out.println("總共查詢出的結果總數為:" + topDocs.totalHits);Document doc;for (ScoreDoc scoreDoc : scoreDocs) {// 文檔對象IDint docId = scoreDoc.doc;doc = searcher.doc(docId);// f) 輸出文檔內容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、 創建查詢(Query對象) Query query = new TermQuery(new Term("filename", "apache")); // 2、 執行搜索 doSearch(query); } 2.2 NumericRangeQuery NumericRangeQuery,指定數字范圍查詢.@Test public void testNumbericRangeQuery() throws Exception {// 創建查詢 // 第一個參數:域名 // 第二個參數:最小值 // 第三個參數:最大值 // 第四個參數:是否包含最小值 // 第五個參數:是否包含最大值 Query query = NumericRangeQuery.newLongRange("size", 1l, 100l, true,true); // 2、 執行搜索 doSearch(query); } 2.3 BooleanQuery BooleanQuery,布爾查詢,實現組合條件查詢。@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:查詢條件必須滿足,相當于AND //SHOULD:查詢條件可選,相當于OR //MUST_NOT:查詢條件不能滿足,相當于NOT非 query.add(query1, Occur.MUST); query.add(query2, Occur.SHOULD);System.out.println(query);search(query); } 組合關系代表的意思如下:1、MUST 和 MUST 表示 “與” 的關系,即“交集”。 2、MUST 和 MUST_NOT 前者包含后者不包含。 3、MUST_NOT 和 MUST_NOT 沒意義 4、SHOULD 與 MUST 表示 MUST,SHOULD 失去意義; 5、SHOUlD 與 MUST_NOT 相當于 MUST 與 MUST_NOT。 6、SHOULD 與 SHOULD 表示 “或” 的概念。 三、通過 QueryParser 搜索 通過 QueryParser 也可以創建 Query,QueryParser 提供一個 Parse 方法,此方法可以直接根據查詢語法來查詢。Query 對象執行的查詢語法可通過 System.out.println(query); 查詢。3.1 QueryParser 代碼實現:@Test public void testQueryParser() throws Exception {// 創建QueryParser // 第一個參數:默認域名 // 第二個參數:分詞器 QueryParser queryParser = new QueryParser("name", new IKAnalyzer()); // 指定查詢語法 ,如果不指定域,就搜索默認的域 Query query = queryParser.parse("lucene"); System.out.println(query); // 2、 執行搜索 doSearch(query); } 查詢語法:1、基礎的查詢語法,關鍵詞查詢:域名 +“:”+ 搜索的關鍵字 例如:content:java 2、范圍查詢域名 +“:”+[最小值 TO 最大值] 例如:size:[1 TO 1000] 注意:QueryParser 不支持對數字范圍的搜索,它支持字符串范圍。 數字范圍搜索建議使用 NumericRangeQuery。 3、組合條件查詢組合條件查詢. PNG 1)+ 條件 1 + 條件 2:兩個條件之間是并且的關系 and 例如:+filename:apache +content:apache2)+ 條件 1 條件 2:必須滿足第一個條件,忽略第二個條件 例如:+filename:apache content:apache3)條件 1 條件 2:兩個條件滿足其一即可。 例如: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 對多個域查詢。@Test public void testMultiFieldQueryParser() throws Exception {// 可以指定默認搜索的域是多個 String[] fields = { "name", "description" }; // 創建一個MulitFiledQueryParser對象 QueryParser parser = new MultiFieldQueryParser(fields, new IKAnalyzer()); // 指定查詢語法 ,如果不指定域,就搜索默認的域 Query query = parser.parse("lucene"); //等同于name:lucene OR description:lucene // Query query = parser.parse("name:lucene OR description:lucene"); // 2、 執行搜索 doSearch(query); } 四、TopDocs Lucene 搜索結果可通過 TopDocs 遍歷,TopDocs 類提供了少量的屬性,如下:topdocs 屬性. PNG 注意:Search 方法需要指定匹配記錄數量 n:indexSearcher.search(query, n) TopDocs.totalHits:是匹配索引庫中所有記錄的數量 TopDocs.scoreDocs:匹配相關度高的前邊記錄數組,scoreDocs 的長度小于等于 search 方法指定的參數 n本文作者: IIsKei 本文鏈接: http://www.iskei.cn/posts/3536.html 版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協議。轉載請注明出處!

?

轉載于:https://www.cnblogs.com/Jeely/p/11224366.html

總結

以上是生活随笔為你收集整理的Lucene 全文搜索解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。