2013-07-01 1 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

예상 결과가 실제 결과와 비교됩니다. 첫 번째 예제에서는 범위 [1 TO 2]를 사용하고 두 번째 예제에서는 [1 TO 3]을 사용하지만 조회가 잘 보입니다. – Keith

+0

두 개의 쿼리 (query1 및 pageQueryRange)를 결합하고 원하는 출력을 얻으려면 AND 연산자를 사용해야합니다 (예 : {Skill_Summary : Java AND Experience : [1 TO 2]}). –

+0

실제로'+ Skill_Summary : Java + Experience : [1 TO 2]'는'Skill_Summary : Java AND Experience : [1 TO 2]'와'+'기호가 기본적으로 양쪽 조건 모두가 true '. 또한, 'TermQuery'를 사용하면 문자 그대로 값과 일치하므로 "java"또는 "JAVA"와 일치하지 않으므로 문제가 될 수 있습니다. – rae1

답변

5

BooleanQuery 클래스를 사용하여 쿼리를 결합하는 Lucene.NET이 사용 AND, ORNOT 기능을 달성하는 가장 쉬운 방법을받지입니다 . 당신이 booleanQuery에 쿼리를 추가 할 때 당신은 당신의 예에서

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 시도가 문자 그대로의 값과 일치하는 사실을 발견, 쿼리를 처리하는 방법을 지정하는 Occur 인수를 사용할 수 있으므로 원 '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에 엉망이되었습니다. 이제 그것은 매력처럼 작동합니다. –