我正在使用基于Lucene.net的搜索引擎在EPiServer网站上工作。
我查询只查找具有特定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);
}
答案 0 :(得分: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;