1.索引庫的維護
索引庫刪除
(1) 全刪除
第一步:先對文件進行分析
public indexwriter getindexwriter() throwsexception
第二步:直接呼叫indexwriter的deleteall方法
@testpublic
void testalldelete() throws
exception
(2) 根據條件刪除
第一步:與上面**一樣
第二步:使用indexwriter的deletedocuments方法,傳入query條件
@testpublic
void testdelete() throws
exception
索引庫修改
對索引庫的修改,其實就是先刪除,在新增。
第一步:同上
第二步:呼叫indexwriter的updatedocument方法
//修改@test
public
void testupdate() throws
exception
索引庫查詢所有
(1) 使用query的子類查詢 (用物件查)
(1.1) matchalldocsquery
//indexreader indexsearcher
public indexsearcher getindexsearcher() throws
exception
//執行查詢結果
public
void printresult(indexsearcher indexsearcher, query query) throws
exception
}//查詢所有
@test
public
void testmatchalldocsquery() throws
exception
(1.2) termquery 精準查詢,之前已經說過。
(1.3) 根據數值範圍查詢 (注意:數值範圍是否包括邊界,使用的方法不一樣).
//根據數值範圍查詢
/*版本更新說明:
在lucene4.10中,關於數字範圍的查詢是使用的numericrangerquery
使用方式:
query query = numericrangerquery.newfloatrange(網域名稱,較小值,較大值,是否包含較小值,是否包含較大值)
在lucene6.6中(不知最早在什麼版本,沒有細查),numericrangerquery被legacynumericrangerquery替代
在lucene7中(應該是從7開始的),lucene開始使用pointvalue來替代之前的filed.而數字範圍查詢方法也進行了修改,
float/long/intpoint.newrangequery取代了之前的numericrangequery的newfloat/long/intrange
使用方法:
query query = float.newrangequery(網域名稱,較小值,較大值);
而這種查詢方法預設包含範圍的端點值,即查詢的是 較小值<=網域名稱<=較大值
如果不想包含端點值:
1.不包含左端點值(即較小值):query query = float.newrangequery(網域名稱,floatpoint.nextup(較小值),較大值);
2.不包含右端點值(即較大值):query query = float.newrangequery(網域名稱,較小值,float.nextdown(較大值));
3.均不包含:結合1和2即可
*/@test
public
void testnumericrangequery() throws
exception
(1.3) 組合查詢條件
//可以組合查詢條件
/*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表示「或」的概念。
版本更新說明:
在lucene 4.10.3中,組合查詢還有無參構造方法,可以通過下面這種方式實現組合查詢:
query query = new booleanquery()
//新增查詢條件,並指定該條件的判斷級別
query.add(query1,occur.must);
query.add(query2,occur.must);
在lucene7.1中,組合查詢只有乙個有參構造方法,並沒有無參構造方法.而是多了乙個靜態內部類builder
public static class builder
//設定最小需要匹配的數
public builder setminimumnumbershouldmatch(int min)
public builder add(booleanclause clause)
clauses.add(clause);
return this;
}中的booleanquery的add方法,支援鏈式程式設計(一般使用這個add方法)
public builder add(query query, occur occur)
//返回乙個booleanquery,用於構造query
public booleanquery build()
}7.1中,occur.must等全都放到了booleanclause中,所以,occur.must等變成了booleanclause.occur.must等
所以在lucene中,組合查詢的使用方法:
query booleanquery = new booleanquery.builder().add(query1,booleanclause.occur.must).add(query2,boolean.occur.must).build();
*/public
void testbooleanquery() throws
exception
(2) 使用queryparser查詢 (用語法查)
網域名稱 + ":" + 搜尋的關鍵字
//條件解析的物件查詢
@test
public
void testqueryparser() throws
exception
(2.2) 範圍查詢
網域名稱 + " :" + [最小值 to 最大值]
例如:size:[1 to 100]
範圍查詢在lucene中支援數值型別,不支援字串型別。在solr中支援字串型別。
(2.3) 組合條件查詢
(2.3.1) +條件1+條件2:兩個條件之間是並且的關係 and
例如:+filename:apache + content:apache
(2.3.2) +條件1 條件2 :必須滿足第乙個條件,應該滿足第二個條件
例如:+filename:apache content:apache
(2.3.3)條件1 條件2:兩個條件滿足其一即可
例如:filename:apache content:apache
(2.3.4) -條件1 條件2:必須不滿足條件1,要滿足條件2
例如:-filename:apache content:apache
(3) 多個預設檢索 multifieldqueryparser
//條件解析物件查詢 多個預設域
@test
public
void testmultifieldqueryparser() throws
exception ;
//引數2,採用分詞器
multifieldqueryparser queryparser = new multifieldqueryparser(fields, new
ikanalyzer());
//"*:*" : 表示查詢所有 "域:值"
query query = queryparser.parse("apache is lucene");
printresult(indexsearcher, query);
}
mysql優化 索引降維
索引降維 我們mysql優化,一般採用建立索引的方式,來提高查詢的速度,怎麼在使用索引的情況下更高效的,充分的使用索引,追求極致,提高自己的查詢速度。都知道在where子句中不要使用一些計算之類的語句,避免索引的失效。什麼是降維?一級級的篩選,一層層的過濾。業務要求查詢某乙個人的記錄,如何查高效。遊...
C 二維陣列索引
int a new int 3,3 a 1,1 10 for int i 0 i a.rank i debug.log math.abs a 1,1 大括號 表示行 逗號,表示列int row array.rank 獲取維數,這裡指行數 int col array.getlength 1 獲取指定維...
SQL索引學習 聚集索引
上面兩位朋友的問題有乙個共同特點,就是希望有示例,因為這樣容易讓他們更加容易理解。但從我的角度來講,有示例只能給你提供乙個參考而已,夠不成是否容易消化的關鍵因素,最好的辦法是,通過自己的理解,自己有能力去做相應的實驗,這樣效果才是最好的,你也會發現更多的問題,每個專案都有自己的特點,所以效能優化這塊...