官术网_书友最值得收藏!

3.3.5 布爾查詢

可以使用BooleanQuery組合多個查詢條件。合取查詢使用BooleanClause.Occur.MUST連接多個查詢詞。

        Term t1 = new Term(FIELD, "lucene");
        TermQuery q1 = new TermQuery(t1);


        Term t2 = new Term(FIELD, "doug");
        TermQuery q2 = new TermQuery(t2);


        //合取查詢
        BooleanQuery query = new BooleanQuery();
        query.add(q1, BooleanClause.Occur.MUST); //必須包含這個條件
        query.add(q2, BooleanClause.Occur.MUST);

選擇出包含任何一個查詢詞的文檔叫作析取(Disjunction)。用真值表描述析取如下。

析取查詢使用BooleanClause.Occur.SHOULD連接多個查詢詞。

        //析取查詢
        BooleanQuery q = new BooleanQuery();
        q.Add(q1, BooleanClause.Occur.SHOULD); //可以只包含這個條件
        q.Add(q2, BooleanClause.Occur.SHOULD);

例如去餐館點菜,有人不喜歡吃辣的東西,所以他找出所有不辣的菜,這叫作否定(Negation)。用真值表描述否定如下。

BooleanClause.Occur.MUST_NOT表示不能包括符合這個條件的文檔。例如找出不包含“辣”的所有文檔。

        Term t1 = new Term("body", "辣");
        TermQuery q1 = new TermQuery(t1);


        BooleanQuery mbq = new BooleanQuery();
        MatchAllDocsQuery alldocs = new MatchAllDocsQuery();  //匹配所有文檔
        mbq.Add(q1, BooleanClause.Occur.MUST_NOT);  //不包括滿足q1條件的文檔
        mbq.Add(alldocs, BooleanClause.Occur.MUST);

打麻將三缺一不行,但是如果同時查詢多個詞,最好只差一個查詢詞的文檔也能匹配。

對于長句搜索,則提取其中的主要查詢詞,只要大部分詞在文檔中出現就可以了。例如搜索聯系方式列:

● "Stanford University School of Medicine, Palo Alto, CA USA",

● "Institute of Neurobiology, School of Medicine, Stanford University, Palo Alto, CA",

● "School of Medicine, Harvard University, Boston MA",

● "Brigham & Women's, Harvard University School of Medicine, Boston, MA"

● "Harvard University, Cambridge MA"

搜索聯系方式使用如下的長查詢詞:

        "School of Medicine, Stanford University, Palo Alto, CA"

需要找到所有和Stanford相關的文檔。

PhraseQuery要求短語中所有的詞都存在才能匹配。這里需要一個更加寬松的PhraseQuery版本,要求它對詞出現的順序敏感,但是允許缺少個別詞,缺少詞的文檔分值低,但是仍然能匹配。BooleanQuery.setMinimumNumberShouldMatch(int)方法可以定義需要匹配的條件的最小數量。

例如,BooleanQuery中有2項,調用BooleanQuery.setMinimumNumberShouldMatch(1)方法可以匹配其中任意的1項或者更多。

        Term t1 = new Term(FIELD, "雞");
        TermQuery q1 = new TermQuery(t1);


        Term t2 = new Term(FIELD, "鴨");
        TermQuery q2 = new TermQuery(t2);


        BooleanQuery mbq = new BooleanQuery();
        mbq.add(q1 , BooleanClause.Occur.SHOULD);
        mbq.add(q2 , BooleanClause.Occur.SHOULD);
        mbq.setMinimumNumberShouldMatch(1);
主站蜘蛛池模板: 博野县| 商洛市| 九江市| 石门县| 巫山县| 休宁县| 柯坪县| 双江| 运城市| 太和县| 九江县| 乌拉特前旗| 吐鲁番市| 辽宁省| 吉安县| 称多县| 德保县| 鄄城县| 阿尔山市| 华安县| 北碚区| 汉寿县| 环江| 仁布县| 家居| 柞水县| 桐乡市| 双柏县| 天气| 阿图什市| 白山市| 卢氏县| 汉寿县| 夏邑县| 双柏县| 祁连县| 宝坻区| 木里| 平邑县| 陈巴尔虎旗| 景泰县|