1

2 つのフィールドに複数の And/OR 条件を持つ NEST クライアントを使用して、ES からドキュメントを取得する必要があります。

私のクエリは次のとおりです。

SELECT * FROM Document WHERE (Year!=2012 && Year!=2013 ) AND (Format=".pdf" || Format=".prt" || Format=".jpeg") 

以下は私のコードです:

var qc = new List<QueryContainer>();        
    foreach (var year in years)// years is the list of years that must not be included
    {
        qc.Add(Query<Document>.Match(m => m.OnField(p => p.Year).Query(year)));
    }

    var qF = new List<QueryContainer>();
    foreach (var format in txtDocs)// txtDocs is the list of formats that should be included if available
    {
        qF.Add(Query<Document>.Match(m => m.OnField(p => p.Format).Query(format)));
    }

    var searchResults = client.Search<Document>(s => s.Index(defaultIndex).From(0).Size(50).
       Query(
       f => f.Bool(
           b => b
               .MustNot(qc.ToArray()).Should(qF.ToArray()))));

このコードを試してみると、結果に表示されてはならない年には機能しますが、ユーザーが選択する必要がある形式では、選択された形式は表示されますが、それらは表示されません。「should」の代わりに「must」も使用しましたが、何も取得されません。

誰かがそのような同様の問題を抱えていましたか?

4

2 に答える 2

2
public class Test
{
    public int Year { get; set; }
    [ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
    public string Format { get; set; }
}

var searchResponse = client.Search<Test>(s => s.Query(q => q
    .Bool(b => b
        .MustNot(
            m => m.Term(t => t.OnField(f => f.Year).Value(2012)),
            m => m.Term(t => t.OnField(f => f.Year).Value(2013))
        )
        .Should(
            should => should.Term(t => t.OnField(f => f.Format).Value(".pdf")),
            should => should.Term(t => t.OnField(f => f.Format).Value(".prt")),
            should => should.Term(t => t.OnField(f => f.Format).Value(".jpeg"))
        )
    )));

それが役に立てば幸い。

于 2015-11-26T14:59:03.590 に答える
1

動的クエリを作成するためのコードは次のとおりです。

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

    QueryContainer qDoc=null;
    foreach (var format in txtDocs)
    {
        qDoc|=new TermQuery() {Field="format", Value= format};            
    }

    var searchResults = client.Search<Document>(s => s.Index(defaultIndex).From(0).Size(50).
       Query(q => q.Bool(b => b.Should(qDoc).MustNot(qYear))));
于 2015-11-27T11:24:50.303 に答える