2011-11-28 35 views
3

我正在使用基於Lucene.net的搜索引擎在EPiServer網站上工作。Lucene.net - 如何創建否定查詢,即。搜索不包含東西的對象

我有一個查詢只查找某個pageTypeId的頁面。現在我想做相反的事情,我只想找到不是某個pageTypeId的頁面。那可能嗎?

這是創建一個查詢只與pageTypeId 1,2或3搜索頁面的代碼:

public BooleanClause GetClause() 
{ 
    var booleanQuery = new BooleanQuery(); 
    var typeIds = new List<string>(); 
    typeIds.Add("1"); 
    typeIds.Add("2"); 
    typeIds.Add("3"); 

    foreach (var id in this.typeIds) 
    { 
     var termQuery = new TermQuery(
      new Term(IndexFieldNames.PageTypeId, id)); 
     var clause = new BooleanClause(termQuery, 
      BooleanClause.Occur.SHOULD); 
     booleanQuery.Add(clause); 
    } 
    return new BooleanClause(booleanQuery, 
     BooleanClause.Occur.MUST); 
} 

我想,而不是創建一個查詢,我尋找的是有一個pageTypeId是網頁不是「4」。

我試着簡單地用「MUST_NOT」替換「SHOULD」和「MUST」,但那不起作用。


感謝@ goalie7960回覆如此之快。這是我修改的代碼,用於搜索除某些選定頁面類型之外的任何內容。本次搜索包含除了那些pageTypeId「1」的所有文件,「2」或「3」:

public BooleanClause GetClause() 
{ 
    var booleanQuery = new BooleanQuery(); 
    booleanQuery.Add(new MatchAllDocsQuery(), 
     BooleanClause.Occur.MUST); 

    var typeIds = new List<string>(); 
    typeIds.Add("1"); 
    typeIds.Add("2"); 
    typeIds.Add("3"); 

    foreach (var typeId in this.typeIds) 
    { 
     booleanQuery.Add(new TermQuery(
      new Term(IndexFieldNames.PageTypeId, typeId)), 
      BooleanClause.Occur.MUST_NOT); 
    } 
    return new BooleanClause(booleanQuery, 
     BooleanClause.Occur.MUST); 
} 

回答

5

假設您的所有文檔有pageTypeId你可以嘗試使用MatchAllDocsQuery然後MUST_NOT刪除所有的文檔你想跳過。這樣的事情我會認爲:

BooleanQuery subQuery = new BooleanQuery(); 
subQuery.Add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); 
subQuery.Add(new TermQuery(new Term(IndexFieldNames.PageTypeId, "4")), BooleanClause.Occur.MUST_NOT); 
return subQuery; 
+0

非常好,MatchAllDocs是我從我的查詢中遺漏的。謝謝! –

+0

當然!再次感謝。 –