1. 程式人生 > >lucene搜索之高級查詢

lucene搜索之高級查詢

ice 數組 cto tab 分詞 apach 後者 最小值 支持

  • 使用Query子類查詢

MatchAllDocsQuery

TermQuery

NumericRangeQuery

BooleanQuery

  • 使用QueryParser

QueryParser

MulitFieldQueryParser

先抽取公共代碼

private void dosearch(Query query) throws IOException {
        //給出索引庫位置
        FSDirectory directory = FSDirectory.open(new File("E:\\upload\\lucene"));

        //創建indexReader
DirectoryReader reader = IndexReader.open(directory); //創建search對象 IndexSearcher searcher = new IndexSearcher(reader); TopDocs topDocs = searcher.search(query, 10); System.out.println(query); ScoreDoc[] ScoreDocs = topDocs.scoreDocs; System.out.println(topDocs.totalHits);
//查詢命中的條數 for (ScoreDoc scoreDoc:ScoreDocs) { int id = scoreDoc.doc;//文檔的id Document doc = searcher.doc(id);//獲取doc對象 System.out.println(doc.get("id")); System.out.println(doc.get("name")); // System.out.println(doc.get("price")); // System.out.println(doc.get("pic"));
// System.out.print(doc.get("description")); } reader.close(); }

第一個MatchAllDoceQuery,是全匹配,匹配的語法是 *:*

@Test
    public void  doMatchAllDocsQuery() throws Exception {//創建query對象
        MatchAllDocsQuery query = new MatchAllDocsQuery();

        dosearch(query);

    }

第二個 是 TermQuery,是精確匹配, 下面匹配的語法是: description:項目

TermQuery termQuery = new TermQuery(new Term("description","項目"));
dosearch(query);

第三個NumericRangeQuery,數字的匹配,表示區間

第一個參數:域的名稱

第二個參數:最小值

第三個參數:最大值

第四個參數:是否包含最小值

第五個參數:是否包含最大值

域名+:+[數值 TO 數值] 表示數值範圍,並且包括數值。如果不包括數值 用"{}"

比如:

price:[55.0 TO 70.0] 等同於 55=< price <=70

price:{55.0 TO 70.0] 等同於 55 < price <=70

 @Test
    public void  doNumericRangeQuery() throws Exception {//創建query對象

    NumericRangeQuery price =NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true);

    dosearch(price);

    }

第四個是BooleanQuery,多條件查詢

1MUSTMUST表示“與”的關系,即“交集”。

2MUSTMUST_NOT前者包含後者不包含。

3MUST_NOTMUST_NOT沒意義

4SHOULDMUST表示MUSTSHOULD失去意義;

5SHOUlDMUST_NOT相當於MUSTMUST_NOT

6SHOULDSHOULD表示“或”的概念。

 @Test
    public void  doBooleanQuery() throws Exception {//創建query對象

        BooleanQuery query = new BooleanQuery();
        TermQuery query1 = new TermQuery(new Term("name","java"));
        NumericRangeQuery<Float> query2 = NumericRangeQuery.newFloatRange("price", 55F, 56F, true, true);
        query.add(query1, BooleanClause.Occur.SHOULD);
        query.add(query2, BooleanClause.Occur.SHOULD);
        dosearch(query);

    }

query的子類不需要指定分詞器,而且不能指定查詢的語法

queryparser 需要指定分詞器 ,而且可以指定查詢的語法

第五個queryParse

TermQuery 是全匹配搜索,如果要搜索一段文字,需要整體匹配才行,如果要搜索包含在這段文字中的詞,需要對這段文字進行分詞。才能進行搜索。queryparser就可以指定一個分詞器,再進行解析,進行查詢。

  @Test
    public void  doQueryParse() throws Exception {
         //創建query對象
         Analyzer analyzer=new IKAnalyzer();
         QueryParser parser = new QueryParser("name",analyzer);
//         Query query = parser.parse("*:*");
//         Query query = parser.parse("lucene java");
//         Query query = parser.parse("name:java AND name:編程");
         Query query = parser.parse("+name:java +name:編程");
         dosearch(query);
    }

第六個MultiFieldQueryParser,可進行多個域匹配

@Test
    public void  doMultiFieldQueryParser() throws Exception {

        Analyzer i=new IKAnalyzer();
        String[] fields={"name","description"};
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, i);
        Query query = queryParser.parse("lucene");
        dosearch(query);
    }

數值範圍類的查詢語法,不支持在queryparser中查詢。語法是沒有錯誤的。在solr中可以查詢出來。

組合條件查詢

Occur.MUST 查詢條件必須滿足,相當於and

+(加號)

Occur.SHOULD 查詢條件可選,相當於or

空(不用符號)

Occur.MUST_NOT 查詢條件不能滿足,相當於not非

-(減號)

1+條件1 +條件2:兩個條件之間是並且的關系and

例如:+filename:apache +content:apache

2)+條件1 條件2:必須滿足第一個條件,忽略第二個條件

例如:+filename:apache content:apache

3)條件1 條件2:兩個條件滿足其一即可。

例如:filename:apache content:apache

4-條件1 條件2:必須不滿足條件1,要滿足條件2

例如:-filename:apache content:apache

第二種寫法:

條件1 AND 條件2

條件1 OR 條件2

條件1 NOT 條件2

註意:

Search方法需要指定匹配記錄數量nindexSearcher.search(query, n)

TopDocs.totalHits:是匹配索引庫中所有記錄的數量

TopDocs.scoreDocs:匹配相關度高的前邊記錄數組,scoreDocs的長度小於等於search方法指定的參數n

lucene搜索之高級查詢