繁体   English   中英

Lucene嵌套的布尔值等效于OR

[英]Lucene Nested Boolean equivalent to OR

我索引中的每个项目都有一个名为TYPE的字段。 这是"Document", "Blog" or "Forum"

用户可以选择要搜索的TYPE,但是如果要搜索“文档”,我需要添加一个范围查询,以便仅在其“ STARTDATE字段处于有效范围内时才返回"Document"类型。

 using (var searcher = new IndexSearcher(_directory, false))
      {

    var analyzer = new StandardAnalyzer(Version.LUCENE_29);

    BooleanQuery booleanQuery = new BooleanQuery();
    BooleanQuery innerTypeFilterQuery = new BooleanQuery();

    long today = Convert.ToInt64(LuceneDate.Today().Value);

    foreach (string filterItem in filterItems)
    {
      TermQuery filterItemQuery = new TermQuery(new Term("Type", filterItem));
      innerTypeFilterQuery.Add(filterItemQuery, Occur.SHOULD);

      if (filterItem == "Document")
      {
        innerTypeFilterQuery.Add(NumericRangeQuery.NewLongRange("StartDate", null, today, true, true), Occur.MUST);
      }
    }

    if (innerTypeFilterQuery.Clauses.Count > 0)
    {
      booleanQuery.Add(innerTypeFilterQuery, Occur.MUST);
    }

    Sort sort = new Sort(new SortField(LuceneGeneric.IndexFields.StartDate, Lucene.Net.Search.SortField.LONG, true));
    var hits = searcher.Search(booleanQuery, null, LuceneContentWidgetResult.HITS_LIMIT, sort).ScoreDocs;
    var results = _mapLuceneContentWidgetSearchResultsToDataList(hits, searcher);
    analyzer.Close();
    searcher.Dispose();
    return results;
}

我的查询如下所示:

{+(Type:Document + StartDate:[* TO 20141022000000] Type:BlogPost Type:ForumQuestion Type:ForumIdea Type:ForumIdeaList Type:ForumDiscussion)}

这取决于您要实现的目标。

假设您有一个文档:

title=foo
date=100 // using numeric value for simplicity

这是这两种查询的真值表(全部作为一个BooleanQuery

   query                      |   doc match result
-------------------------------------------------------------------------------------
title:foo +date:[80 TO 150]   | true (both matched)
title:foo +date:[10 TO 20]    | false (date hasn't matched even though title matched)
title:boo +date:[80 TO 150]   | true (date matched but title hasn't)
title:boo +date:[10 TO 20]    | false (none matched)
-------------------------------------------------------------------------------------
title:foo date:[80 TO 150]    | true (both matched)
title:foo date:[10 TO 20]     | true (date hasn't matched but title matched)
title:boo date:[80 TO 150]    | true (date matched but title hasn't)
title:boo date:[10 TO 20]     | false (none matched)

如您所见,表的前4行MUST是日期,后4行SHOULD是日期。

Q>不确定在哪里添加,是否需要向innerTypeFilterQuery添加另一个布尔查询
A>请再次说明您想要哪种匹配结果,但是如果上述真值表中的任何结果满足您的要求,则可以将其添加到同一查询中。

编辑:我认为您的查询应如下所示:

+((Type:Document +StartDate:[* TO 20141022000000]) Type:BlogPost Type:ForumQuestion Type:ForumIdea Type:ForumIdeaList Type:ForumDiscussion)

因此,是的,您将需要一个单独的布尔查询来包装两个Document约束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM