1. 程式人生 > >Lucene筆記11-Lucene的搜尋-基於QueryParser的搜尋

Lucene筆記11-Lucene的搜尋-基於QueryParser的搜尋

一、QueryParser查詢

QueryParser查詢功能是非常強大的,幾乎可以涵蓋前面所有的查詢,下面是方法體,它將query作為引數傳遞進來。

// 表示式查詢
public void searchByQueryParser(Query query, int number) {
    IndexSearcher indexSearcher = getIndexSearcher();
    try {
        TopDocs topDocs = indexSearcher.search(query, number);
        System.out.println("一共查詢到:" + topDocs.totalHits);
        for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("id") + " " + document.get("name") + " " + document.get("email"));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (indexSearcher != null) {
            try {
                indexSearcher.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

二、測試案例

將query和number傳入searchByQueryParser()方法就可以查詢了。

// 預設搜尋域為content
QueryParser queryParser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));
// 將預設操作符為and,預設是or
queryParser.setDefaultOperator(QueryParser.Operator.AND);
// 搜尋content中包含basketball或者football的
Query query = queryParser.parse("basketball football");
// 改變預設搜尋域查詢
Query query = queryParser.parse("name:zhangsan");
// 改變預設搜尋域且使用萬用字元查詢
Query query = queryParser.parse("name:z*");
// 查詢name中以i結尾的,預設是不允許查詢*開頭的,因為會影響效率,不過我們可以手動開啟許可權
queryParser.setAllowLeadingWildcard(true);
Query query = queryParser.parse("name:*i");
// 查詢content(預設搜尋域)有football的,並且name不是lisi的,-和+後面必須有空格
Query query = queryParser.parse("- name:lisi + football");
// 查詢id是1到3的,包括端點值,這裡的TO必須是大寫的,改成to會報錯
Query query = queryParser.parse("id:[1 TO 3]");
// 查詢id是1到3的,不包括端點值,這裡的TO必須是大寫的,改成to會報錯
Query query = queryParser.parse("id:{1 TO 3}");
// 完全匹配I like football的
Query query = queryParser.parse("\"I like football\"");
// 匹配I * football的,並且單詞間距為1的
Query query = queryParser.parse("\"I like football\"~1");
// 加一個~構成模糊搜尋
Query query = queryParser.parse("name:lixi~");