【问题标题】:Lucene.net filter if index record has specific value如果索引记录具有特定值,则 Lucene.net 过滤器
【发布时间】:2017-01-18 11:42:03
【问题描述】:

我有一个 Lucene.net 索引,其中包含应用多个查询的搜索:

BooleanQuery filterQuery = new BooleanQuery();

if (searchDto.SubCategoryId != Guid.Empty)
{
    TermQuery tq = new TermQuery(new Term("SubCategoryId", searchDto.SubCategoryId.ToString()));
    filterQuery.Add(tq, Occur.MUST);
}

if (!string.IsNullOrEmpty(searchDto.SearchPhrase))
{
    var parser = new MultiFieldQueryParser
      (Version.LUCENE_30, new[] { "Title", "Description", "SubCategoryName", "LongDescription" }, analyzer);
    var query = parseQuery(searchDto.SearchPhrase, parser);
    filterQuery.Add(query, Occur.MUST);
}

topDocs = searcher.Search(filterQuery, null, hits_limit);

这很好用。例如,如果我将子类别 ID 传递给它,它只会匹配子类别。但是,我如何制定一个匹配的查询,而不是基于我是否向它发送过滤器值,而是基于索引记录是否具有其中一个字段的值。

例如,lucene 索引记录字段之一是IsBundle。现在,如果IsBundletrue,我想要记录如果RelationshipId 匹配我发送的searchDto.RelationshipId。如果IsBundlefalse,我不关心RelationshipId。所以我的最终结果是IsBundletrueRelationshipId 匹配我的searchDto.RelationshipId 并且IsBundlefalse 的记录组合。

【问题讨论】:

    标签: search lucene lucene.net


    【解决方案1】:

    如果你把逻辑折叠起来,这不就相当于

    IsBundle==false OR RelationshipID==x
    

    var q = new BooleanQuery();
    q.Add(new TermQuery(new Term("IsBundle", "true"), Occur.SHOULD);
    q.Add(new TermQuery(new Term("RelationshipID", dto.thing), Ocurr.SHOULD);
    

    【讨论】:

      【解决方案2】:

      没有关于索引字段RelationshipID的细节,我假设RelationshipID是一个字符串类型。

      如果指定了你想要的 searchDto.RelationshipID

      (RelationshipID:{searchDto.RelationshipID} AND IsBundle:true) OR IsBundle:false
      

      如果 searchDto.RelationshipID 没有给出

      IsBundle:false
      

      此代码将适当的查询添加到 filterQuery。

      if (!String.IsNullOrEmpty(searchDto.RelationshipID))
      {
          BooleanQuery q = new BooleanQuery();
          q.Add(new BooleanClause(
              new TermQuery(new Term("RelationshipId", searchDto.RelationshipID)), Occur.MUST)
              );
          q.Add(new BooleanClause(
              new TermQuery(new Term("IsBundle", "true")), Occur.MUST)
              );
          BooleanClause clause = new BooleanClause(q, Occur.SHOULD);
          q = new BooleanQuery();
          q.Add(clause);
          q.Add(new BooleanClause(
                              new TermQuery(new Term("IsBundle", "false")), Occur.SHOULD)
                              );                
          filterQuery.Add(q,Occur.MUST);            
      }
      else
      {
          filterQuery.Add(new BooleanClause(
              new TermQuery(new Term("IsBundle", "false")), Occur.MUST)
              );
      }
      

      可能有一种优雅的方式来组合查询,但这满足要求。

      【讨论】:

        猜你喜欢
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多