lucene多樣化搜尋,結果排序。

2021-08-29 14:28:52 字數 3085 閱讀 7657

一:多樣化的搜尋

/** *** 乙個關鍵字,對乙個字段進行查詢 **** */

queryparser qp = new queryparser("content",analyzer);

query = qp.parse(keyword);

hits hits = searcher.search(query);

/** *** 模糊查詢 **** */

term term = new term("content",keyword);

fuzzyquery fq = new fuzzyquery(term);

hits hits = searcher.search(fq);

/** *** 乙個關鍵字,在兩個欄位中查詢 **** */

/** 1.booleanclause.occur的三種型別: must : + and must_not : - not should : or

* 2.下面查詢的意思是:content中必須包含該關鍵字,而title有沒有都無所謂

* 3.下面的這個查詢中,occur的長度必須和fields的長度一致。每個限制條件對應乙個字段

*/booleanclause.occur flags = new booleanclause.occur;

query=multifieldqueryparser.parse(keyword,new string,flags,analyzer);

/** *** 兩個(多個)關鍵字對兩個(多個)字段進行查詢,預設匹配規則 **** */

/** 1.關鍵字的個數必須和字段的個數相等

* 2.由於沒有指定匹配規定,預設為"should" 因此,下面查詢的意思是:"title"中含有keyword1 或 "content"含有keyword2.

* 在此例中,把keyword1和keyword2相同

*/query=multifieldqueryparser.parse(new string,new

string,analyzer);

/** *** 兩個(多個)關鍵字對兩個(多個)字段進行查詢,手工指定匹配規則 **** */

/** 1.必須 關鍵字的個數 == 欄位名的個數 == 匹配規則的個數

* 2.下面查詢的意思是:"title"必須不含有keyword1,並且"content"中必須含有keyword2

*/booleanclause.occur flags = new

booleanclause.occur;

query=multifieldqueryparser.parse(new string,new

string,flags,analyzer);

/** *** 對日期型字段進行查詢 **** */

/** *** 對數字範圍進行查詢 **** */

/** 1.兩個條件必須是同乙個字段

* 2.前面乙個條件必須比後面乙個條件小,否則找不到資料

* 3.new rangequery中的第三個引數,表示是否包含"=" true: >= 或 <= false: > 或 <

* 4.找出 55>=id>=53 or 60>=id>=57:

*/term lowerterm1 = new term("id","53");

term upperterm1 = new term("id","55");

rangequery rq1 = new rangequery(lowerterm1,upperterm1,true);

term lowerterm2 = new term("id","57");

term upperterm2 = new term("id","60");

rangequery rq2 = new rangequery(lowerterm2,upperterm2,true);

booleanquery bq = new booleanquery();

bq.add(rq1,booleanclause.occur.should);

bq.add(rq2,booleanclause.occur.should);

hits hits = searcher.search(bq);

二:結果排序

排序的關鍵點有兩個:

1:首先你要排序的字段必須是被index的,並且是untokenized的。

如:newfield(

"click

",dv.get(

"click

").tostring(),field.store.no,field.index.un_tokenized));

2:在檢索時候:

如:/***** 排序 *****/

/** 1.被排序的字段必須被索引過(indexecd),在索引時不能 用 field.index.tokenized

* (用un_tokenized可以正常實現.用no時查詢正常,但排序不能正常設定公升降序)

* 2.sortfield型別

* score、doc、auto、string、int、float、custom此型別主要是根據欄位的型別選擇

* 3.sortfield的第三個引數代表是否是降序true:降序 false:公升序

*/sort sort = new sort(new sortfield);

hits hits = searcher.search(querystring,sort);

/** 按日期排序

*/sort sort = new sort(new sortfield);

/***** 過濾器 ******/

queryparser qp1 = new queryparser("content",analyzer);

query fquery = qp1.parse("我");

booleanquery bqf = new booleanquery();

bqf.add(fquery,booleanclause.occur.should);

queryfilter qf = new queryfilter(bqf);

hits hits = searcher.search(query);

solr的多樣化查詢

由需要確定查詢的方式。範圍查詢是根據欄位的字典順序進行的查詢 詞條查詢 test public void testterm throws exception 萬用字元查詢 test public void testwildcard throws exception 模糊查詢 test public ...

多樣化紋理合成

基於判別器和生成器建模方法的紋理合成具有很大的潛力,但是現有方法為了效率而採用的前向網路在泛化能力上並不行,即乙個網路只能合成一種紋理,缺少多樣性。本文著重解決該問題。訓練乙個多紋理合成網路存在的一些困難 不同型別紋理的統計特是完全不同,使用基於 gram 矩陣的紋理損失 1,2 只能部分的衡量其中...

使用lucene對搜尋結果排序

lucene預設根據匹配度對搜尋結果降序排,如果對某個域進行排序?通常分兩步 step1 建索引時 newfield audittime row.get audittime tostring 關鍵點是你需要排序的字段建索引時應該採用 field.index.un tokenized,至於需不需要 f...