在創(chuàng)建索引的時候分為了許多Field列,在查詢的時候可以同時查詢這些列,然后使用布爾邏輯查詢將這些查詢返回的結(jié)果合并。
在沒有使用布爾邏輯查詢之前的代碼:
public void seacher(String queryString) throws IOException, ParseException {
String field[] = { "title", "content", "author" };
for (int i = 0; i < field.length; i++) {
String defualtField = field[i];
TopDocs topDocs = null;
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get(indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = getAnalyzer();
//QueryParser是用來解析查詢串
QueryParser queryParser
= new QueryParser(defualtField, analyzer);
Query query = queryParser.parse(queryString);
//返回最相關(guān)的10個文檔
topDocs = searcher.search(query, 10);
ScoreDoc[] hits = topDocs.scoreDocs;
for (ScoreDoc hit : hits) {
Document hitDoc = searcher.doc(hit.doc);
System.out.println(hitDoc.get("title")
+ " " + hitDoc.get("url"));
}
}
}
得到的結(jié)果為:

會將重復的結(jié)果也展示
改為布爾邏輯查詢:
public void seacher(String queryString) throws IOException, ParseException {
TopDocs topDocs = null;
IndexReader reader = DirectoryReader.open(
FSDirectory.open(Paths.get(indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = getAnalyzer();
// QueryParser是用來解析查詢串
QueryParser queryParser = new QueryParser("title", analyzer);
Query titleQuery = queryParser.parse(queryString);// 查詢標題列
queryParser = new QueryParser("content", analyzer);// 查詢內(nèi)容列
Query contentQuery = queryParser.parse(queryString);
queryParser = new QueryParser("autor", analyzer);// 查詢作者列
Query authorQuery = queryParser.parse(queryString);
// 使用布爾邏輯查詢
BooleanQuery.Builder queryBuild=new BooleanQuery.Builder();
queryBuild.add(titleQuery,BooleanClause.Occur.SHOULD);
queryBuild.add(contentQuery,BooleanClause.Occur.SHOULD);
queryBuild.add(authorQuery,BooleanClause.Occur.SHOULD);
BooleanQuery query=queryBuild.build();
// 返回最相關(guān)的10個文檔
topDocs = searcher.search(query, 10);
ScoreDoc[] hits = topDocs.scoreDocs;
for (ScoreDoc hit : hits) {
Document hitDoc = searcher.doc(hit.doc);
System.out.println(hitDoc.get("title")
+ " " + hitDoc.get("url"));
}
}

將重復的結(jié)果去掉了
在Lucene 6.1.0使用布爾邏輯查詢可以先創(chuàng)建一個BooleanQuery.Builder對象,通過add方法將之前的創(chuàng)建的查詢加入到該對象中,然后再調(diào)用build()方法轉(zhuǎn)換為BooleanQuery 對象。
一共有4種Occur方式:
/** Use this operator for clauses that <i>must</i> appear in the matching documents. */
MUST { @Override public String toString() { return "+"; } },
/** Like {@link #MUST} except that these clauses do not participate in scoring. */
FILTER { @Override public String toString() { return "#"; } },
/** Use this operator for clauses that <i>should</i> appear in the
* matching documents. For a BooleanQuery with no <code>MUST</code>
* clauses one or more <code>SHOULD</code> clauses must match a document
* for the BooleanQuery to match.
* @see BooleanQuery.Builder#setMinimumNumberShouldMatch
*/
SHOULD { @Override public String toString() { return ""; } },
/** Use this operator for clauses that <i>must not</i> appear in the matching documents.
* Note that it is not possible to search for queries that only consist
* of a <code>MUST_NOT</code> clause. These clauses do not contribute to the
* score of documents. */
MUST_NOT { @Override public String toString() { return "-"; } };
SHOULD是析取查詢,選擇出包含任何一個查詢詞的文檔;
MUST_NOT是否定查詢,即不包括符合這個條件的文檔。
BooleanQuery對象還可以設(shè)置最小匹配數(shù)量,只要設(shè)置minimumNumberShouldMatch屬性即可(在構(gòu)造函數(shù)中設(shè)置)。