2013-07-01 18 views
3

我試過以下方法來組合查詢,但我不知道如何在這些查詢中添加(AND,OR,NOT)運算符。如何在Lucene.NET中使用運算符組合術語查詢和數字查詢?

BooleanQuery booleanQuery = new BooleanQuery(); 
Query query1 = new TermQuery(new Term("Skill_Summary", "Java")); 
Query pageQueryRange = NumericRangeQuery.NewIntRange("Experience", 1, 2, true, true); 
booleanQuery.Add(query1, BooleanClause.Occur.MUST); 
booleanQuery.Add(pageQueryRange, BooleanClause.Occur.MUST); 
var hits = searcher.Search(booleanQuery); 

上述booleanQuery的結果是+Skill_Summary:Java +Experience:[1 TO 2]仍然沒有得到結果

String termQueryString = "Skill_Summary:\"Java\""; 
Query termQuery = queryParser.Parse(termQueryString); 
Query QueryRange = NumericRangeQuery.NewIntRange("Experience", 1, 3, true, true); 
Query query = termQuery.Combine(new Query[] { termQuery, QueryRange }); 
var hits = searcher.Search(query); 
+0

什麼是你期望的結果與實際情況? BTW你的查詢看起來很好,雖然第一個例子使用範圍[1到2],第二個例子使用[1到3]。 – Keith

+0

我需要使用AND運算符來加入兩個查詢(query1和pageQueryRange)並獲得所需的輸出(例如:{Skill_Summary:Java和經驗:[1到2]})。 –

+0

實際上'+ Skill_Summary:Java + Experience:[1到2]'與'Skill_Summary:Java AND Experience:[1到2]'相同,因爲'+'符號基本上說兩個條件的條件都需要'true '。此外,使用'TermQuery'將字面匹配值,所以它將*不*匹配「java」或「JAVA」,這可能是問題... – rae1

回答

5

使用Lucene.NET是使用BooleanQuery類查詢相結合,實現ANDORNOT功能的最簡單方法。當你把你的查詢到booleanQuery可以使用Occur參數指定查詢應該如何處理,

var termQuery = new TermQuery(new Term("Skill_Summary", "Java")); 
var booleanQuery = new BooleanQuery(); 

// Use 'Occur.MUST` to simulate an AND, or '+Skill_Summary:Java' 
booleanQuery.Add(termQuery, Occur.MUST); 

// Use 'Occur.SHOULD` to simulate an OR, or just 'Skill_Summary:Java' 
booleanQuery.Add(termQuery, Occur.SHOULD); 

// Use 'Occur.MUST_NOT` to simulate a NOT, or just '-Skill_Summary:Java' 
booleanQuery.Add(termQuery, Occur.MUST_NOT); 

在您的例子,你可能會發現TermQuery嘗試值字面匹配,所以它贏得不匹配「java」或「Java」等值。要做到這一點,你需要做的,

var booleanQuery = new BooleanQuery(); 

// Use QueryParser 
var query1 = new QueryParser(version, "Skill_Summary", analyzer).Parse("Java"); 
var pageQueryRange = NumericRangeQuery.NewIntRange("Experience", 1, 2, true, true); 
booleanQuery.Add(query1, BooleanClause.Occur.MUST); 
booleanQuery.Add(pageQueryRange, BooleanClause.Occur.MUST); 
var hits = searcher.Search(booleanQuery); 
+0

我得到了termquery和queryparser.thank搞砸你的好解釋現在它像一個魅力。 –