搜索字符串值并且数组中的空字符不起作用

时间:2019-09-10 10:27:40

标签: elasticsearch nest

我是Elastic Search和NEST的新手 我在ES中的文档结构如下:

{
    "Quote":"QuoteId1",
    "references" : [
            {
              "ref" : "8658315",
              "rel" : "Number"
            },
            {
              "ref" : "E",
              "rel" : "Type"
            },
            {
              "ref" : "2001511072965",
              "rel" : "Order"
            }
        ] 
}

{
    "Quote":"QuoteId2",
    "references" : [
            {
              "ref" : "8658316",
              "rel" : "Number"
            },
            {
              "ref" : "E",
              "rel" : "Type"
            },
            {
              "ref" : "",
              "rel" : "Order"
            }
        ] 
}

{
    "Quote":"QuoteId2",
    "references" : [
            {
              "ref" : "8658316",
              "rel" : "Number"
            },
            {
              "ref" : "E",
              "rel" : "Type"
            }
        ] 
}

我想检索所有引号:

1) Quotes which have Rel = "Order" and Ref == "" (Quotes which were ordered but are invalid now)
2) Quotes which does not have Rel = "Order" (Quotes which are not ordered at all)


1) Quotes which have Rel = "Order" and Ref == "" (Quotes which were ordered but are invalid now)

    Tried retrieving the quotes using below NEST query :

    a)  var searchFieldList = new List<string>() { "Order" };
        queryContainer &= Query<QuoteIndex>.Nested(
            a => a.Path(o => o.References).Query(q => q.Bool(b => b.Filter(
                m => !m.Terms(t => t.Field(f => f.References.Select(st => st.Rel).ToArray()).Terms(searchFieldList)) && 
                     !m.Range(r => r.Field(f1 => f1.References.Select(st1 => st1.Ref)).GreaterThan(0))
                ))));


    b)  var searchFieldList = new List<string>() { "Order" };
        var searchFieldValue = new List<string>() { "" };

        queryContainer &= Query<QuoteIndex>.Nested(
           a => a.Path(o => o.References).Query(q => q.Bool(b => b.Strict().Must(
               m => m.Terms(t => t.Field(f => f.References.Select(st => st.Rel).ToArray()).Terms(searchFieldList)) &&
                    m.Terms(t => t.Verbatim().Field(f => f.References.Select(st => st.Ref).ToArray()).Terms(searchFieldValue))
               ))));

    Result: both queries returns QuoteID1 i.e where REL = "Order" and Ref = "2001511072965"

2) Quotes which does not have Rel = "Order" (Quotes which are not ordered at all)

    Tried retrieving the quotes using below NEST query :

    a)  var searchFieldList = new List<string>() { "Order" };
        queryContainer &= Query<QuoteIndex>.Nested(
            a => a.Path(o => o.References).Query(q => q.Bool(b => b.Filter(
                m => !m.Terms(t => t.Field(f => f.References.Select(st => st.Rel).ToArray()).Terms(searchFieldList)) 
                ))));

    b)  var searchFieldList = new List<string>() { "Order" };

        queryContainer &= Query<QuoteIndex>.Nested(
           a => a.Path(o => o.References).Query(q => q.Bool(b => b.Strict().MustNot(
               m => m.Terms(t => t.Field(f => f.References.Select(st => st.Rel).ToArray()).Terms(searchFieldList)) 
               ))));

    Result: both queries returns QuoteID1 i.e where REL = "Order" and Ref = "2001511072965"

我需要获取Rel =“ Order” && Ref ==“” union的文档,其中Rel =“ Order”不存在,但无法通过上述查询获取相同的文档,任何帮助都将非常有用

0 个答案:

没有答案