Lucene 全文搜索解析
生活随笔
收集整理的這篇文章主要介紹了
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 全文搜索解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github项目汇总
- 下一篇: JavaScript每日学习日记(0)