Lucene中內置常用Query對象
來源:程序員人生 發布時間:2014-12-18 08:50:34 閱讀次數:3822次
以下這幾種lucene內置查詢對象,不過在實際的項目開發中,這類查詢方式利用的不多。1般用QueryParser去獲得查詢對象。由于QueryParser內部基本實現了所有的內置查詢對象。
這是最多見的QueryParse的寫法
/**
* 通過QueryParser去獲得查詢對象
*
* @throws ParseException
*/
@Test
public void searchByQueryParse() throws ParseException {
// 1創建QueryParser對象,默許域為content,可以改變
QueryParser parser = new QueryParser(Version.LUCENE_35, "content",
new StandardAnalyzer(Version.LUCENE_35));
// 改變空格的默許操作符,以下可以改成AND
parser.setDefaultOperator(Operator.AND);
// 開啟第1個字符的通配查詢,默許是關閉的,太消耗性能
parser.setAllowLeadingWildcard(true);
// 搜索包括content中包括like的
Query query = parser.parse("like");
// 查詢content中,basketball 和 basketball 的文檔
query = parser.parse("basketball football");
// 改變搜索域
query = parser.parse("name:make");
// 用*或? 通配符匹配
query = parser.parse("name:j*");
// 通配符默許不能放在首位
query = parser.parse("email:*@itat.org");
// 查詢 名字中沒mike,content中like的。 +和- 必須要放在前面
query = parser.parse("- name:mike + like");
// 匹配1個區間,TO必須大寫
query = parser.parse("id:[1 TO 6]");
// 開區間
query = parser.parse("id:{1 TO 3}");
/**
* 查詢字符串中空格的,加上“” 完全匹配
*/
query = parser.parse(""I like football"");
// 查詢I和football中1個字符距離的
query = parser.parse(""I football"~1");
// 沒辦法匹配數字范圍,必須要自定義
query = parser.parse("attach:[2 TO 10]");
// 模糊匹配
query = parser.parse("name:make~");
su.searchByQueryParse(query, 10);
}
這是對term(最小分詞單元)的查詢
/**
* 備注:這里的精確匹配查詢,是匹配索引文件中的詞。
* 如果 是搜索英文,忽視大小寫
* @param field
* @param name
* @param num
*/
public void searchByTerm(String field,String name,int num) {
try {
IndexSearcher searcher = getSearcher();
Query query = new TermQuery(new Term(field,name));
TopDocs tds = searcher.search(query, num);
String[] path = FieldCache.DEFAULT.getStrings(reader, "name");
System.out.println(path.length);
for(String p:path){
System.out.println(p);
}
System.out.println("查詢總數:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
//System.out.println(sd.score);-查詢得分信息
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
多值查詢(BooleanQuery)可以用來連接多個子查詢:
/**
* 多值查詢
* @param num
*/
public void searchByBoolean(int num) {
try {
IndexSearcher searcher = getSearcher();
BooleanQuery query = new BooleanQuery();
/*
* BooleanQuery連接多值查詢
* Occur.MUST表示必須出現
* Occur.SHOULD表示可以出現
* Occur.MUSE_NOT表示必須不能出現
*/
query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);
query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);
TopDocs tds = searcher.search(query, num);
System.out.println("命中數:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
范圍搜索(TermRangeQuery):
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String dir = "D:user";
try {
Directory directory = FSDirectory.open(new File(dir));
@SuppressWarnings("deprecation")
IndexReader reader = IndexReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(reader);
/**
* 范圍搜索
*/
Term begin = new Term("datetime", "191111");
Term end = new Term("datetime", "198108");
/**
* 參數Boolean值說明 false表示不包括 191111 true 表示包括198108 這兩個Boolean表示查詢結果
* 是不是包括lower,upper兩個臨界值
*/
TermRangeQuery termRangeQuery = new TermRangeQuery("datetime",
begin.bytes(), end.bytes(), false, true);
TopDocs topDocs = indexSearcher.search(termRangeQuery, 10);
ScoreDoc scoreDocs[] = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
Document document = indexSearcher.doc(scoreDocs[i].doc);
System.out.println(document.get("id"));
System.out.println(document.get("name"));
System.out.println(document.get("text"));
System.out.println(document.get("datetime"));
}
directory.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
數字范圍查詢:
public void searchByNumricRange(String field,int start,int end,int num) {
try {
IndexSearcher searcher = getSearcher();
Query query = NumericRangeQuery.newIntRange(field,start, end,true,true);
TopDocs tds = searcher.search(query, num);
System.out.println("命中數量:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
前綴搜索(PrefixQuery),注意也是對詞的前綴搜索:
/**
* 前綴搜索
* @param field
* @param value
* @param num
*/
public void searchByPrefix(String field,String value,int num) {
try {
IndexSearcher searcher = getSearcher();
Query query = new PrefixQuery(new Term(field,value));
TopDocs tds = searcher.search(query, num);
System.out.println("命中數:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
通配符搜索(WildcardQuery)
/**
* 通配符查詢 ?和*
* @param field
* @param value
* @param num
*/
public void searchByWildcard(String field,String value,int num) {
try {
IndexSearcher searcher = getSearcher();
//在傳入的value中可使用通配符?和*,問號表示匹配1個字符,*表示匹配任意多個字符
Query query = new WildcardQuery(new Term(field,value));
TopDocs tds = searcher.search(query, num);
System.out.println("1共命中數:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
短語查詢(PhraseQuery),根據零碎的短語組合成新的詞組進行搜索,1般利用于英文搜索中
public void searchByPhrase(int num) {
try {
IndexSearcher searcher = getSearcher();
PhraseQuery query = new PhraseQuery();
//設置跳數
query.setSlop(3);
query.add(new Term("content","pingpeng"));
//第1個Term
query.add(new Term("content","i"));
//產生距離以后的第1個Term
// query.add(new Term("content","football"));
TopDocs tds = searcher.search(query, num);
System.out.println("命中數:"+tds.totalHits);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
模糊匹配(searchByFuzzy),允許有個別毛病的查詢
public void searchByFuzzy(int num) {
try {
IndexSearcher searcher = getSearcher();
//調劑類似讀
FuzzyQuery query = new FuzzyQuery(new Term("name","mase"),0.4f,0);
System.out.println(query.getPrefixLength());
System.out.println(query.getMinSimilarity());
TopDocs tds = searcher.search(query, num);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println(doc.get("id")+"---->"+
doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+
doc.get("attach")+","+doc.get("date"));
}
searcher.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈