【问题标题】:Nest Elasticsearch, combining bool query of Must and ShouldNest Elasticsearch,结合 Must 和 Should 的 bool 查询
【发布时间】:2016-06-06 13:58:36
【问题描述】:

我想按年份、格式和内容过滤一组文档。

n 伪 SQL:

SELECT * FROM /test/document
WHERE 
((format=f1|| format=f2||...|| format=fn) AND 
(Year!=2013 AND Year!=2015) AND 
(content like %c1% || content like %c2% ||...|| content like %cn%))

如您所见,格式和内容项的数量是动态的,将由用户选择。 到目前为止,我想出了如何分别对每个字段进行动态查询,然后使用 bool 查询将它们组合起来,如下面的代码;

// For YEAR
QueryContainer qYear=null;
    foreach (var year in years)
    {
        qYear |= new TermQuery() { Field = "year", Value = year };     
    }

// For FORMAT
 var qformat = new List<QueryContainer>();
 foreach (var format in txtDocs)
   {                    
     qformat.Add(Query<Document>.Match(m => m.OnField(p => p.Format).Query(format)));                
   }

  // For CONTENT
  var qc = new List<QueryContainer>();
   qc.Add(Query<Document>.Match(m => m.OnField(p => p.File).Query(discpString).Boost(2)));
    qc.Add(Query<Document>.Match(m => m.OnField(p => p.File).Query(roleString)));
    qc.Add(Query<Document>.Match(m => m.OnField(p => p.File).Query(taskString)));
    qc.Add(Query<Document>.Match(m => m.OnField(p => p.File).Query(sysString).Boost(2)));

//MY QUERY
 var searchResults = client.Search<Document>(s => s.Fields(f => f.Title, f => f.Format, f => f.Year, f => f.DateCreated, f => f.Id, f => f.Path, f => f.Size, f => f.Firstwords).
           Index(defaultIndex).From(0).Size(100).
           Query(q => q.Bool(b => b.MustNot(qYear).Should(qformat.ToArray()).Should(qc.ToArray()))));

当我运行此代码时,年份和内容字段的结果是我所期望的,但过滤列表中没有的其他格式也包括在内!我希望它只检索具有所选格式的文档。 有谁知道我的错误在哪里?

【问题讨论】:

    标签: c# elasticsearch nest booleanquery


    【解决方案1】:

    我可以找到我的错误在哪里! 我在与 Year 相同的命令中使用了 Querycontainer 格式,然后在我的查询中使用了 Must。这是代码的更改部分:

     // For FORMAT
     QueryContainer qF=null;
     foreach (var format in txtDocs)
     {
         qF |= new TermQuery()
         { 
             Field = "format", 
             Value = format 
         }; 
     }
    
    //MY QUERY
    var searchResults = client.Search<Document>(s => s
         .Fields(
            f => f.Title, 
            f => f.Format, 
            f => f.Year, 
            f => f.DateCreated, 
            f => f.Id, 
            f => f.Path, 
            f => f.Size, 
            f => f.Firstwords)
        .Index(defaultIndex)
        .From(0)
        .Size(100)
        .Query(q => q
           .Bool(b => b.MustNot(qYear)
           .Must(qF)
           .Should(qc.ToArray())
         )
    );
    

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2020-05-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2015-04-16
      相关资源
      最近更新 更多