lucene搜尋之進階查詢

來源:互聯網
上載者:User

標籤:支援   概念   script   content   解析   doc   rmq   redo   director   

  • 使用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,多條件查詢

 1、MUST和MUST表示“與”的關係,即“交集”。

     2、MUST和MUST_NOT前者包含後者不包含。

     3、MUST_NOT和MUST_NOT沒意義

     4、SHOULD與MUST表示MUST,SHOULD失去意義;

     5、SHOUlD與MUST_NOT相當於MUST與MUST_NOT。

     6、SHOULD與SHOULD表示“或”的概念。

 @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方法需要指定匹配記錄數量n:indexSearcher.search(query, n)

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

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

 

lucene搜尋之進階查詢

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.