lucene solr學習 索引維護

2022-09-01 19:57:14 字數 4444 閱讀 1319

1.索引庫的維護

索引庫刪除

(1) 全刪除

第一步:先對文件進行分析

public indexwriter getindexwriter() throws

exception

第二步:直接呼叫indexwriter的deleteall方法

@test

public

void testalldelete() throws

exception

(2) 根據條件刪除

第一步:與上面**一樣

第二步:使用indexwriter的deletedocuments方法,傳入query條件

@test

public

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索引學習 聚集索引

上面兩位朋友的問題有乙個共同特點,就是希望有示例,因為這樣容易讓他們更加容易理解。但從我的角度來講,有示例只能給你提供乙個參考而已,夠不成是否容易消化的關鍵因素,最好的辦法是,通過自己的理解,自己有能力去做相應的實驗,這樣效果才是最好的,你也會發現更多的問題,每個專案都有自己的特點,所以效能優化這塊...