黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Lucene-2.2.0 源代碼閱讀學(xué)習(xí)(30)

系統(tǒng) 2039 0

關(guān)于Query的學(xué)習(xí)。

主要使用TermQuery和BooleanQuery,它們是最最基礎(chǔ)的Query。

我感覺(jué)Query的靈活性太大了,這就使得它那么地具有魅力。

當(dāng)用戶提交了檢索關(guān)鍵字以后,首先就是要根據(jù)這個(gè)關(guān)鍵字進(jìn)行分析,因?yàn)椴煌挠脩籼峤坏年P(guān)鍵詞具有不同的特點(diǎn),所以使用不同方式來(lái)構(gòu)造Query是極其關(guān)鍵的,從而使提供的檢索服務(wù)最大程度地滿足用戶的意愿。

先看看Query抽象類(lèi)的繼承關(guān)系,如圖所示:

最簡(jiǎn)單最基礎(chǔ)的就是構(gòu)造一個(gè)TermQuery,根據(jù)詞條本身直接來(lái)構(gòu)造一個(gè)Query,從而進(jìn)行檢索。

Query類(lèi)抽象類(lèi)了進(jìn)行檢索所具有的共同特征,源代碼實(shí)現(xiàn)如下所示:

package org.apache.lucene.search;

import java.io.IOException;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.apache.lucene.index.IndexReader;

public abstract class Query implements java.io.Serializable, Cloneable {

// boost是一個(gè)非常重要的屬性,它體現(xiàn)了檢索到的Document的重要程度,Lucene默認(rèn)值為1.0,當(dāng)然可以自行設(shè)置
private float boost = 1.0f;????????????????????

public void setBoost(float b) { boost = b; }

public float getBoost() { return boost; }

public abstract String toString(String field);

public String toString() {
??? return toString("");
}

//??? 一個(gè)Query與一個(gè)Weight相關(guān)
protected Weight createWeight(Searcher searcher) throws IOException {
??? throw new UnsupportedOperationException();
}

public Weight weight(Searcher searcher)
??? throws IOException {
??? Query query = searcher.rewrite(this);
??? Weight weight = query.createWeight(searcher);
??? float sum = weight.sumOfSquaredWeights();
??? float norm = getSimilarity(searcher).queryNorm(sum);
??? weight.normalize(norm);
??? return weight;
}

//??? 重寫(xiě)一個(gè)Query
public Query rewrite(IndexReader reader) throws IOException {
??? return this;
}

//??? 該方法主要是為復(fù)雜查詢建立的,通過(guò)多個(gè)Query的合并來(lái)實(shí)現(xiàn),比如,一個(gè)BooleanQuery可以是幾個(gè)TermQuery的合并
public Query combine(Query[] queries) {
??? HashSet uniques = new HashSet();
??? for (int i = 0; i < queries.length; i++) {
????? Query query = queries[i];
????? BooleanClause[] clauses = null;
????? //?? 是否需要將一個(gè)Query分割成多個(gè)查詢子句的標(biāo)志
????? boolean splittable = (query instanceof BooleanQuery);???
// 可見(jiàn),這里是對(duì)BooleanQuery而言的
????? if(splittable){
??????? BooleanQuery bq = (BooleanQuery) query;
??????? splittable = bq.isCoordDisabled();
??????? clauses = bq.getClauses();
??????? for (int j = 0; splittable && j < clauses.length; j++) {
????????? splittable = (clauses[j].getOccur() == BooleanClause.Occur.SHOULD);
??????? }
????? }
????? if(splittable){
??????? for (int j = 0; j < clauses.length; j++) {
????????? uniques.add(clauses[j].getQuery());
??????? }
????? } else {
??????? uniques.add(query);
????? }
??? }
???
// 如果只有一個(gè)查詢子句,直接返回
??? if(uniques.size() == 1){
??????? return (Query)uniques.iterator().next();
??? }
??? Iterator it = uniques.iterator();
??? BooleanQuery result = new BooleanQuery(true);
??? while (it.hasNext())
????? result.add((Query) it.next(), BooleanClause.Occur.SHOULD);
??? return result;
}

//??? 從構(gòu)造的Query中提取出與該查詢關(guān)聯(lián)的詞條,即用戶鍵入的檢索關(guān)鍵字構(gòu)造的詞條
public void extractTerms(Set terms) {
??? // needs to be implemented by query subclasses
??? throw new UnsupportedOperationException();
}


//??? 合并多個(gè)BooleanQuery,構(gòu)造復(fù)雜查詢
public static Query mergeBooleanQueries(Query[] queries) {
??? HashSet allClauses = new HashSet();
??? for (int i = 0; i < queries.length; i++) {
????? BooleanClause[] clauses = ((BooleanQuery)queries[i]).getClauses();
????? for (int j = 0; j < clauses.length; j++) {
??????? allClauses.add(clauses[j]);
????? }
??? }

??? boolean coordDisabled =
????? queries.length==0? false : ((BooleanQuery)queries[0]).isCoordDisabled();
??? BooleanQuery result = new BooleanQuery(coordDisabled);
??? Iterator i = allClauses.iterator();
??? while (i.hasNext()) {
????? result.add((BooleanClause)i.next());
??? }
??? return result;
}

//??? 獲取與查詢相關(guān)的Similarity(相似度)實(shí)例
public Similarity getSimilarity(Searcher searcher) {
??? return searcher.getSimilarity();
}

//??? Query是支持克隆的
public Object clone() {
??? try {
????? return (Query)super.clone();
??? } catch (CloneNotSupportedException e) {
????? throw new RuntimeException("Clone not supported: " + e.getMessage());
??? }
}
}

上面出現(xiàn)了BooleanQuery,從字面可以了解到這種Query是基于邏輯運(yùn)算的。BooleanQuery可以是多個(gè)子句的邏輯運(yùn)算。從BooleanQuery的代碼中可以看到,它支持子句的最大數(shù)量為1024:

private static int maxClauseCount = 1024;

但是,并非越多子句參與邏輯運(yùn)算就越好,這里有個(gè)效率問(wèn)題,因?yàn)槎鄠€(gè)子句的合并,要通過(guò)各自的Query之后,然后再進(jìn)行這種邏輯運(yùn)算,有時(shí)時(shí)間開(kāi)銷(xiāo)是不可取的。

BooleanClause是在一個(gè)BooleanQuery中子句。該類(lèi)中定義了一個(gè)靜態(tài)最終內(nèi)部類(lèi)Occur定義了BooleanQuery的運(yùn)算符:

??? public static final Occur MUST = new Occur("MUST");??? // 與運(yùn)算
??? public static final Occur SHOULD = new Occur("SHOULD");???
// 或運(yùn)算
??? public static final Occur MUST_NOT = new Occur("MUST_NOT");??? // 非運(yùn)算

可以通過(guò)上面三個(gè)算子對(duì)Query進(jìn)行合并,實(shí)現(xiàn)復(fù)雜的查詢操作。

編寫(xiě)一個(gè)例子,通過(guò)構(gòu)造三個(gè)TermQuery,將他們添加(add)到一個(gè)BooleanQuery查詢中,使用MUST與運(yùn)算,如下所示:

package org.apache.lucene.shirdrn.main;

import java.io.IOException;
import java.util.Date;
import java.util.Iterator;

import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hit;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

public class BloeanQuerySearcher {

?? public static void main(String[] args) {
???
??? String indexPath = "E:\\Lucene\\myindex";
??? try {
???? IndexSearcher searcher = new IndexSearcher(indexPath);
????
???? String keywordA = "的";
???? Term termA = new Term("contents",keywordA);
???? Query tQueryA = new TermQuery(termA);
????
???? String keywordB = "是";
???? Term termB = new Term("contents",keywordB);
???? Query tQueryB = new TermQuery(termB);
????
???? String keywordC = "在";
???? Term termC = new Term("contents",keywordC);
???? Query tQueryC = new TermQuery(termC);
????
???? Term[] arrayTerm = new Term[]{null,null,null};
???? arrayTerm[0] = termA;
???? arrayTerm[1] = termB;
???? arrayTerm[2] = termC;
????
???? BooleanQuery bQuery = new BooleanQuery();
???? bQuery.add(tQueryA,BooleanClause.Occur.MUST);
???? bQuery.add(tQueryB,BooleanClause.Occur.MUST);
???? bQuery.add(tQueryC,BooleanClause.Occur.MUST);

????
???? Date startTime = new Date();
???? Hits hits = searcher.search(bQuery);
???? Iterator it = hits.iterator();
???? System.out.println("********************************************************************");
???? while(it.hasNext()){
????? Hit hit = (Hit)it.next();
????? System.out.println("Hit的ID 為 : "+hit.getId());
????? System.out.println("Hit的score 為 : "+hit.getScore());
????? System.out.println("Hit的boost 為 : "+hit.getBoost());
????? System.out.println("Hit的toString 為 : "+hit.toString());
????? System.out.println("Hit的Dcoment 為 : "+hit.getDocument());
????? System.out.println("Hit的Dcoment 的 Fields 為 : "+hit.getDocument().getFields());
????? for(int i=0;i<hit.getDocument().getFields().size();i++){
?????? Field field = (Field)hit.getDocument().getFields().get(i);
?????? System.out.println("????? -------------------------------------------------------------");
?????? System.out.println("????? Field的Name為 : "+field.name());
?????? System.out.println("????? Field的stringValue為 : "+field.stringValue());
????? }
????? System.out.println("********************************************************************");
???? }
???? System.out.println("包含3個(gè)詞條的Hits長(zhǎng)度為 : "+hits.length());
???? for(int i=0;i<searcher.docFreqs(arrayTerm).length;i++){
????? System.out.println("包含3個(gè)詞條的Document的數(shù)量為 : "+searcher.docFreqs(arrayTerm)[i]);
???? }
???? Date finishTime = new Date();
???? long timeOfSearch = finishTime.getTime() - startTime.getTime();
???? System.out.println("本次搜索所用的時(shí)間為 "+timeOfSearch+" ms");
??? } catch (CorruptIndexException e) {
???? e.printStackTrace();
??? } catch (IOException e) {
???? e.printStackTrace();
??? }
?? }
}

?

下面對(duì)各種邏輯運(yùn)算的組合看一下效果:

1、第一種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST );

查詢結(jié)果即是,同時(shí)包含三個(gè)詞條(詞條的文本內(nèi)容為:的、在、是)的所有文檔被檢索出來(lái)??梢圆孪胍幌?,上面撒個(gè)詞條:“的”、“是”、“在”在漢語(yǔ)中應(yīng)該是出現(xiàn)頻率非常高的,預(yù)期結(jié)果應(yīng)該會(huì)查詢出來(lái)較多的符合下面與運(yùn)算條件的結(jié)果:

???? bQuery.add(tQueryA,BooleanClause.Occur.MUST);
???? bQuery.add(tQueryB,BooleanClause.Occur.MUST);
???? bQuery.add(tQueryC,BooleanClause.Occur.MUST);

實(shí)際運(yùn)行結(jié)果如下所示:

********************************************************************
Hit的ID 為 : 12
Hit的score 為 : 0.63582987
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [0] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\CustomKeyInfo.txt> stored/uncompressed,indexed<modified:200406041814>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\CustomKeyInfo.txt>, stored/uncompressed,indexed<modified:200406041814>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\CustomKeyInfo.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200406041814
********************************************************************
Hit的ID 為 : 24
Hit的score 為 : 0.6183762
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [1] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\FAQ.txt> stored/uncompressed,indexed<modified:200604130754>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\FAQ.txt>, stored/uncompressed,indexed<modified:200604130754>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\FAQ.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200604130754
********************************************************************
Hit的ID 為 : 63
Hit的score 為 : 0.53687334
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [2] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\疑問(wèn)即時(shí)記錄.txt> stored/uncompressed,indexed<modified:200711141408>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\疑問(wèn)即時(shí)記錄.txt>, stored/uncompressed,indexed<modified:200711141408>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\疑問(wèn)即時(shí)記錄.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200711141408
********************************************************************
Hit的ID 為 : 60
Hit的score 為 : 0.50429535
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [3] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\貓吉又有個(gè)忙,需要大家?guī)兔σ幌?txt> stored/uncompressed,indexed<modified:200706161112>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\貓吉又有個(gè)忙,需要大家?guī)兔σ幌?txt>, stored/uncompressed,indexed<modified:200706161112>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\貓吉又有個(gè)忙,需要大家?guī)兔σ幌?txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200706161112
********************************************************************
Hit的ID 為 : 46
Hit的score 為 : 0.4266696
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [4] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\使用技巧集萃.txt> stored/uncompressed,indexed<modified:200511210413>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\使用技巧集萃.txt>, stored/uncompressed,indexed<modified:200511210413>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\使用技巧集萃.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200511210413
********************************************************************
Hit的ID 為 : 56
Hit的score 為 : 0.4056765
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [5] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\新1建 文本文檔.txt> stored/uncompressed,indexed<modified:200710311142>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\新1建 文本文檔.txt>, stored/uncompressed,indexed<modified:200710311142>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\新1建 文本文檔.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200710311142
********************************************************************
Hit的ID 為 : 41
Hit的score 為 : 0.3852732
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [6] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\Update.txt> stored/uncompressed,indexed<modified:200707050028>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\Update.txt>, stored/uncompressed,indexed<modified:200707050028>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\Update.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200707050028
********************************************************************
Hit的ID 為 : 37
Hit的score 為 : 0.35885736
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [7] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\readme.txt> stored/uncompressed,indexed<modified:200803101314>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\readme.txt>, stored/uncompressed,indexed<modified:200803101314>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\readme.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200803101314
********************************************************************
Hit的ID 為 : 48
Hit的score 為 : 0.35885736
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [8] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\劍心補(bǔ)丁使用說(shuō)明(readme).txt> stored/uncompressed,indexed<modified:200803101357>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\劍心補(bǔ)丁使用說(shuō)明(readme).txt>, stored/uncompressed,indexed<modified:200803101357>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\劍心補(bǔ)丁使用說(shuō)明(readme).txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200803101357
********************************************************************
Hit的ID 為 : 47
Hit的score 為 : 0.32808846
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [9] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\關(guān)系記錄.txt> stored/uncompressed,indexed<modified:200802201145>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\關(guān)系記錄.txt>, stored/uncompressed,indexed<modified:200802201145>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\關(guān)系記錄.txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200802201145
********************************************************************
包含3個(gè)詞條的Hits長(zhǎng)度為 : 10
包含3個(gè)詞條的Document的數(shù)量為 : 23
包含3個(gè)詞條的Document的數(shù)量為 : 12
包含3個(gè)詞條的Document的數(shù)量為 : 14
本次搜索所用的時(shí)間為 203 ms

從上面測(cè)試可見(jiàn),查詢的記過(guò)具有10項(xiàng),應(yīng)該符合我們預(yù)期的假設(shè)的。

2、第二種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. MUST_NOT );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST );

?

即,把不包含詞條“的”,但是同時(shí)包含詞條“是”和“在”,查詢出來(lái)的結(jié)果應(yīng)該不會(huì)太多,中文的文章中“的”出現(xiàn)的頻率很高很高,上面指定了MUST_NOT,非邏輯運(yùn)算符,結(jié)果如下所示:

********************************************************************
Hit的ID 為 : 54
Hit的score 為 : 0.22303896
Hit的boost 為 : 1.0
Hit的toString 為 : Hit<
org.apache.lucene.search.Hits@ab50cd [0] resolved>
Hit的Dcoment 為 : Document<stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\指定時(shí)間內(nèi)關(guān)閉網(wǎng)頁(yè).txt> stored/uncompressed,indexed<modified:200111200742>>
Hit的Dcoment 的 Fields 為 : [stored/uncompressed,indexed<path:E:\Lucene\txt1\mytxt\指定時(shí)間內(nèi)關(guān)閉網(wǎng)頁(yè).txt>, stored/uncompressed,indexed<modified:200111200742>]
????? -------------------------------------------------------------
????? Field的Name為 : path
????? Field的stringValue為 : E:\Lucene\txt1\mytxt\指定時(shí)間內(nèi)關(guān)閉網(wǎng)頁(yè).txt
????? -------------------------------------------------------------
????? Field的Name為 : modified
????? Field的stringValue為 : 200111200742
********************************************************************
3個(gè)詞條的Hits長(zhǎng)度為 : 1
包含3個(gè)詞條的Document的數(shù)量為 : 23
包含3個(gè)詞條的Document的數(shù)量為 : 12
包含3個(gè)詞條的Document的數(shù)量為 : 14
本次搜索所用的時(shí)間為 140 ms

符合查詢條件的只有一項(xiàng),只有記事本文件E:\Lucene\txt1\mytxt\指定時(shí)間內(nèi)關(guān)閉網(wǎng)頁(yè).txt中滿足查詢條件,即該文件中一定沒(méi)有詞條“的”出現(xiàn),但是同時(shí)包含詞條“是”和“在”。

3、第三種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. SHOULD );
???? bQuery.add(tQueryB,BooleanClause.Occur. SHOULD );
???? bQuery.add(tQueryC,BooleanClause.Occur. SHOULD );

即或操作,可想而知,滿足條件的結(jié)果項(xiàng)應(yīng)該是最多的(我的測(cè)試是24項(xiàng))。

4、第四種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. MUST_NOT );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST_NOT );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST_NOT );

不包含三個(gè)詞條的查詢部結(jié)果。如果是通常的文本,文本信息量較大,如果同時(shí)不包含“的”、“是”、“在”三個(gè)詞條,結(jié)果是可想而知的,幾乎檢索不出來(lái)任何符合這一條件的結(jié)果集。

還有一點(diǎn),用戶通過(guò)鍵入關(guān)鍵字進(jìn)行檢索,不會(huì)有這樣的用戶:不想獲取與自己鍵入關(guān)鍵字匹配的結(jié)果呢,其實(shí)這種組合沒(méi)有意義的。

我的測(cè)試為:

********************************************************************
3個(gè)詞條的Hits長(zhǎng)度為 : 0
包含3個(gè)詞條的Document的數(shù)量為 : 23
包含3個(gè)詞條的Document的數(shù)量為 : 12
包含3個(gè)詞條的Document的數(shù)量為 : 14
本次搜索所用的時(shí)間為 94 ms

如果你建立索引的數(shù)據(jù)源文件類(lèi)似古代詩(shī)詞曲那樣的文本,可能檢索出來(lái)的結(jié)果會(huì)很可觀的。

5、第五種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. SHOULD );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST_NOT );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST_NOT );

???? bQuery.add(tQueryA,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST_NOT );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST_NOT );

經(jīng)過(guò)測(cè)試,可以得知,上面的這兩種組合檢索得到的結(jié)果集是一樣的。也就是說(shuō),SHOULD在與MUST_NOT進(jìn)行組合的時(shí)候,其實(shí)就是MUST在和MUST_NOT進(jìn)行組合。

6、第六種組合:

???? bQuery.add(tQueryA,BooleanClause.Occur. SHOULD );
???? bQuery.add(tQueryB,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST );

其實(shí)這種組合與SHOULD沒(méi)有任何關(guān)系了,相當(dāng)于下面的2個(gè)MUST的組合:

???? bQuery.add(tQueryB,BooleanClause.Occur. MUST );
???? bQuery.add(tQueryC,BooleanClause.Occur. MUST );

這兩種組合檢索出來(lái)的結(jié)果集是一樣的。

總結(jié)

使用BooleanQuery進(jìn)行查詢,它工作的機(jī)制是這樣的:

1、先對(duì)BooleanQuery中的每個(gè)子句分別進(jìn)行查詢,得到多個(gè)結(jié)果集;

2、對(duì)BooleanQuery的各個(gè)子句得到的結(jié)果集,進(jìn)行集合的運(yùn)算(交、并、非)。

最終,集合運(yùn)算的結(jié)果就是顯示給用戶的,與用戶查詢條件匹配的記錄。

Lucene-2.2.0 源代碼閱讀學(xué)習(xí)(30)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論