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

3.6 查詢語法與解析

Lucene不僅提供了API來自己創(chuàng)建查詢,而且還通過查詢分析器提供了豐富的查詢語言。

● 一個短語查詢可以用雙引號括起來,這樣只有精確匹配該短語的文檔才會匹配查詢條件。比如,搜索“上海世博會”只會出現(xiàn)包含連續(xù)出現(xiàn)“上海”和“世博會”的文檔。如果“上海”和“世博會”之間有其他詞,則不會匹配這樣的情況。所以搜索“上海世博會”“上海AND世博會”這樣的查詢返回的結果更少。

● 使用^表示加權。例如搜索“solr^4 lucene”

● 修飾符“+”“-”“NOT”。例如搜索“+solr lucene”

● 布爾操作符“OR”“AND”。例如搜索“(solr OR lucene) AND user”。注意這里的AND必須是大寫的,如果是小寫,即and,就會被當作普通查詢詞看待了。

● 按域查詢。一個字段名后面跟冒號,再加上要搜索的詞語或短句,就可以把搜索條件限制在該字段。例如搜索“title:NBA”,匹配標題包含NBA的文檔。

QueryParser將輸入查詢字串解析為Lucene的Query對象,如圖3-17所示。

圖3-17 使用查詢表達式搜索

下面兩個寫法在功能上是等價的:

    QueryParser parser = new QueryParser("name", wrapper);
    Query query = parser.parse("size:small AND color:blue");

    BooleanQuery skuQuery = new BooleanQuery();
    skuQuery.add(new TermQuery(new Term("size", "small")), Occur.MUST);
    skuQuery.add(new TermQuery(new Term("color", "blue")), Occur.MUST);

可以檢查返回的結果:

    QueryParser parser = new QueryParser("title",
                    analyzer);
    Query query = parser.parse("Monitor");
    System.out.println(query.getClass().getName());
    //org.apache.lucene.search.TermQuery

這表示QueryParser.parse()方法返回的是一個簡單的TermQuery。

直接這樣寫可能找不到結果:

    Query query = new QueryParser("url", analyzer).parse(url);

需要把URL地址中的特殊字符當作普通字符看待。

        Query query = new QueryParser("url",
                                  analyzer).newTermQuery(
                                            new Term("url", url)).parse(url);

有一些特殊字符,如單引號、轉(zhuǎn)義符等符號,怎么讓Lucene忽略它們,而把它們當作一般的字符串去查詢?方法是使用“\\”轉(zhuǎn)義或者直接調(diào)用org.apache.lucene.queryparser. classic.QueryParserBase.escape(String)方法。

主站蜘蛛池模板: 无为县| 江达县| 尚义县| 全椒县| 友谊县| 五家渠市| 马公市| 湘阴县| 通化市| 灌阳县| 绥化市| 获嘉县| 常山县| 岫岩| 宝坻区| 上杭县| 阳谷县| 临高县| 枣强县| 巴彦淖尔市| 厦门市| 鸡泽县| 若尔盖县| 吴桥县| 永登县| 成武县| 伽师县| 平远县| 临安市| 吉安市| 瓮安县| 会同县| 泽库县| 平阴县| 眉山市| 京山县| 周口市| 长寿区| 温泉县| 越西县| 龙山县|