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)
@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);
}
@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);