3

Lucene.netベースの検索エンジンを使用してEPiServerWebサイトで作業しています。

特定の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);
}

代わりに、「4」ではないpageTypeIdを持つページを検索するクエリを作成したいと思います。

「SHOULD」と「MUST」を「MUST_NOT」に置き換えてみましたが、うまくいきませんでした。


迅速に返信してくれた@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);  
}
4

1 に答える 1

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;
于 2011-11-28T14:41:27.233 に答える