lucene搜索之高級查詢
- 使用Query子類查詢
MatchAllDocsQuery
TermQuery
NumericRangeQuery
BooleanQuery
- 使用QueryParser
QueryParser
MulitFieldQueryParser
先抽取公共代碼
private void dosearch(Query query) throws IOException { //給出索引庫位置 FSDirectory directory = FSDirectory.open(new File("E:\\upload\\lucene")); //創建indexReaderDirectoryReader reader = IndexReader.open(directory); //創建search對象 IndexSearcher searcher = new IndexSearcher(reader); TopDocs topDocs = searcher.search(query, 10); System.out.println(query); ScoreDoc[] ScoreDocs = topDocs.scoreDocs; System.out.println(topDocs.totalHits);//查詢命中的條數 for (ScoreDoc scoreDoc:ScoreDocs) { int id = scoreDoc.doc;//文檔的id Document doc = searcher.doc(id);//獲取doc對象 System.out.println(doc.get("id")); System.out.println(doc.get("name")); // System.out.println(doc.get("price")); // System.out.println(doc.get("pic"));// System.out.print(doc.get("description")); } reader.close(); }
第一個MatchAllDoceQuery,是全匹配,匹配的語法是 *:*
@Test public void doMatchAllDocsQuery() throws Exception {//創建query對象 MatchAllDocsQuery query = new MatchAllDocsQuery(); dosearch(query); }
第二個 是 TermQuery,是精確匹配, 下面匹配的語法是: description:項目
TermQuery termQuery = new TermQuery(new Term("description","項目"));
dosearch(query);
第三個NumericRangeQuery,數字的匹配,表示區間
第一個參數:域的名稱
第二個參數:最小值
第三個參數:最大值
第四個參數:是否包含最小值
第五個參數:是否包含最大值
域名+“:”+[數值 TO 數值] 表示數值範圍,並且包括數值。如果不包括數值 用"{}"
比如:
price:[55.0 TO 70.0] 等同於 55=< price <=70
price:{55.0 TO 70.0] 等同於 55 < price <=70
@Test public void doNumericRangeQuery() throws Exception {//創建query對象 NumericRangeQuery price =NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true); dosearch(price); }
第四個是BooleanQuery,多條件查詢
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表示“或”的概念。
@Test public void doBooleanQuery() throws Exception {//創建query對象 BooleanQuery query = new BooleanQuery(); TermQuery query1 = new TermQuery(new Term("name","java")); NumericRangeQuery<Float> query2 = NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true); query.add(query1, BooleanClause.Occur.SHOULD); query.add(query2, BooleanClause.Occur.SHOULD); dosearch(query); }
query的子類不需要指定分詞器,而且不能指定查詢的語法
queryparser 需要指定分詞器 ,而且可以指定查詢的語法
第五個queryParse
TermQuery 是全匹配搜索,如果要搜索一段文字,需要整體匹配才行,如果要搜索包含在這段文字中的詞,需要對這段文字進行分詞。才能進行搜索。queryparser就可以指定一個分詞器,再進行解析,進行查詢。
@Test public void doQueryParse() throws Exception { //創建query對象 Analyzer analyzer=new IKAnalyzer(); QueryParser parser = new QueryParser("name",analyzer); // Query query = parser.parse("*:*"); // Query query = parser.parse("lucene java"); // Query query = parser.parse("name:java AND name:編程"); Query query = parser.parse("+name:java +name:編程"); dosearch(query); }
第六個MultiFieldQueryParser,可進行多個域匹配
@Test public void doMultiFieldQueryParser() throws Exception { Analyzer i=new IKAnalyzer(); String[] fields={"name","description"}; MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, i); Query query = queryParser.parse("lucene"); dosearch(query); }
數值範圍類的查詢語法,不支持在queryparser中查詢。語法是沒有錯誤的。在solr中可以查詢出來。
組合條件查詢
Occur.MUST 查詢條件必須滿足,相當於and |
+(加號) |
Occur.SHOULD 查詢條件可選,相當於or
|
空(不用符號) |
Occur.MUST_NOT 查詢條件不能滿足,相當於not非 |
-(減號) |
1)+條件1 +條件2:兩個條件之間是並且的關系and
例如:+filename:apache +content:apache
2)+條件1 條件2:必須滿足第一個條件,忽略第二個條件
例如:+filename:apache content:apache
3)條件1 條件2:兩個條件滿足其一即可。
例如:filename:apache content:apache
4)-條件1 條件2:必須不滿足條件1,要滿足條件2
例如:-filename:apache content:apache
第二種寫法:
條件1 AND 條件2
條件1 OR 條件2
條件1 NOT 條件2
註意:
Search方法需要指定匹配記錄數量n:indexSearcher.search(query, n)
TopDocs.totalHits:是匹配索引庫中所有記錄的數量
TopDocs.scoreDocs:匹配相關度高的前邊記錄數組,scoreDocs的長度小於等於search方法指定的參數n
lucene搜索之高級查詢