Lucene 的查詢方式|排序

來源:互聯網
上載者:User

Lucene 查詢中有兩種查詢方式:使用字串查詢[可以使用特定的查詢文法]    使用對像查詢[查詢對象,通過它的子類來實現]

 

Query 查詢:TermQuery 關鍵字查詢  RangeQuery 範圍查詢  WildcardQuery 短語查詢   BooleanQuery 布爾查詢

 

private String indexPath="D://ec_pj//LuceneDemo1//luceneIndex";
 private Analyzer analyzer=new MMAnalyzer();
 @Test
 public void test(){
  
 }
 @Test
 public void testTermQuery()throws Exception{
  //Term term=new Term("content","老婆");
  //Term term=new Term("content","KEY");  //關鍵詞中沒有大寫,均為小寫字元
  Term term=new Term("content","key");
  Query query=new TermQuery(term);
  List<Document> resultList=search(query);
  for (Document doc : resultList) {
   System.out.println(doc.get("name"));
   System.out.println(doc.get("content"));
   System.out.println(doc.get("size"));
   System.out.println(doc.get("path"));
  }
 }
 
 @Test
 public void testRangeQuery()throws Exception{
  Term lowerTerm=new Term("size",NumberTools.longToString(70));     //範圍大小是按字串比較大小的  
  Term upperTerm=new Term("size",NumberTools.longToString(2045));

  //NumberTools.longToString(200)  使用工具類,轉為化字串採用36進位儲存  採用工具類時,建立索引時也要使用該工具類
  Query query=new RangeQuery(lowerTerm, upperTerm, true);  //boolean 是否包含邊界
  System.out.println(query.toString());
  List<Document> resultList=search(query);
  for (Document doc : resultList) {
   System.out.println(doc.get("name"));
   System.out.println(doc.get("content"));
   System.out.println(doc.get("size"));
   System.out.println(doc.get("path"));
  }
 }
 同樣的日期的處理也有對應的工具類:DateTools

DateTools.dateToString(new Date(), Resolution.DAY)

 

 

 /**
  * 短語查詢  中間可以隔幾個詞
  * @throws Exception
  */
 @Test
 public void testPhraseQuery()throws Exception{
  PhraseQuery query=new PhraseQuery();
//  query.add(new Term("content","snta"),1);
//  query.add(new Term("content","love"),3);
  
  query.add(new Term("content","code"));
  query.add(new Term("content","love"));
  //設定兩個關鍵字中間可以隔多少個單鍵詞
  query.setSlop(5);   //會覆蓋前面的設定,如果是0代表位置精確匹配
  List<Document> resultList=search(query);
  printResult(resultList);
 }
 
 /**
  * 可以將幾個查詢組合起來,查詢所有條件都滿足或部分滿足或都不滿足的結果
  * @throws Exception
  * MUST 和MUST取查詢子句的交集
  * MUST 和 MUST_NOT:包含MUST不包含MUST_NOT的查詢結果
  * SHOULD和SHOULD表示或關係,所有查詢子句的並集
  *
  * 使用時注意:
  * MUST和SHOULD,些時SHOULD無意義,結果為MUST子句的檢索結果
  * MUST_NOT和MUST_NOT,無意義,檢索無結果
  * MUST_NOT和SHOULD,些時SHOULD相當於MUST,結果同MUST和MUST_NOT
  * 單獨使用SHOULD ,結果相當於MUST
  * 單獨使用MUST_NOT,無意義,檢索無結果
  */
 @Test
 public void testBooleanQuery()throws Exception{
  
  Term term=new Term("content","snt?");
  Query query1=new WildcardQuery(term);
  
  PhraseQuery query2=new PhraseQuery();
  query2.add(new Term("content","code"));
  query2.add(new Term("content","love"));
  query2.setSlop(5);
  
  BooleanQuery query=new BooleanQuery();
  query.add(query1, Occur.MUST_NOT);
  query.add(query2, Occur.SHOULD);
  List<Document> resultList=search(query);
  printResult(resultList);
 }

 

查詢文法:content:李樂平    欄位:關鍵字   content:key

範圍查詢:欄位:[100000 TO 200000]  格式  size:(2 to 4)  size:[2,4]

萬用字元查詢:  name:lov?

短語查詢:  content:"? 我 ? ? ? 喜歡 "     content:"我 喜歡"~2   中間至多想隔兩個關鍵字

布爾查詢:  +content:snt? -content:"code love"~5    +代表必須的  -必須排除   MUST和MUST_NOT

如果:SHOULD SHOULD 沒有符號   content:snt? content:"code love"~5

 

AND OR NOT

@Test
 public void testQueryString()throws Exception{
//  String query="content:snt?  AND  content:/"code love/"~5";
//  String query="content:snt?  OR  content:/"code love/"~5";
  String query="content:snt?  NOT  content:/"code love/"~5";
  //多個條件組合可以加括弧
  List<Document> resultList=search(query);
  printResult(resultList);
 }

 

 搜尋結果的排序      預設根據相關度排序   也可以按照指定的規則排序

可以影響相關度排序,指定Field的boost屬性[預設值為1.0f]   指定Document的boost 值

在檢索前指定上面的boost值   在建立索引時指定boost值

Document doc=File2DocumentUtils.file2Document(filePath);
  //doc.setBoost(2f);
  Document doc1=File2DocumentUtils.file2Document(filePath1);
  //doc1.setBoost(5f);
  IndexWriter iw=new IndexWriter(FSDirectory.getDirectory(new File(indexPath)),analyzer,true,MaxFieldLength.LIMITED);
  iw.addDocument(doc);
  iw.addDocument(doc1);
  iw.close();

 

 

//boosts.put("name", 3f);
  //boosts.put("document", 2f);
  
  QueryParser queryParser=new MultiFieldQueryParser(new String[]{"name","content"},analyzer,boosts);

 

 

查詢search()  方法最後一個參數是個排序條件

 

  Sort sort=new Sort();
  sort.setSort("size", true);   //如果為true,降序
  TopDocs topdocs=is.search(query, null, 10000,sort);

 

過濾器 Filter  過濾器的使用會對檢索效能產生很大影響

Filter filter=new RangeFilter("size", NumberTools.longToString(200), NumberTools.longToString(2550), true, true);
  TopDocs topdocs=is.search(query, filter, 10000,sort);

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.