ElasticSearch(NEST)中的多项过滤器

时间:2015-10-06 17:37:09

标签: elasticsearch nest

我正在尝试根据具有多个可能值的给定字段查询文档。例如,我的文档有一个"扩展名"属性,它是.docxxls.pdf等文件的扩展类型。我希望能够过滤我的"扩展程序"任意数量的值的属性,但找不到获得此功能所需的正确语法。这是我目前的查询:

desc.Type("entity")
                .Routing(serviceId)
                .From(pageSize * pageOffset)
                .Size(pageSize)
                .Query(q => q
                    .Filtered(f => f
                        .Query(qq =>
                            qq.MultiMatch(m => m
                                .Query(query)
                                .OnFields(_searchFields)) ||
                            qq.Prefix(p1 => p1
                                .OnField("entityName")
                                .Value(query)) ||
                            qq.Prefix(p2 => p2
                                .OnField("friendlyUrl")
                                .Value(query))
                        )
                        .Filter(ff =>
                            ff.Term("serviceId", serviceId) &&
                            ff.Term("subscriptionId", subscriptionId) &&
                            ff.Term("subscriptionType", subscriptionType) &&
                            ff.Term("entityType", entityType)
                        )
                    )
                );

P.S。可能更容易想到反过来,我发送文件扩展名 DON' T 想要并设置查询以获取 DON&#T; T的文档具有任何扩展值。

2 个答案:

答案 0 :(得分:2)

经过讨论,这应该是一个原始的json查询,它应该可以工作,并且可以很容易地转换为NEST:

POST /test/_search
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "serviceId": "VALUE"
              }
            },
            {
              "term": {
                "subscriptionId": "VALUE"
              }
            },
            {
              "term": {
                "subscriptionType": "VALUE"
              }
            },
            {
              "term": {
                "entityType": "VALUE"
              }
            }
          ],
          "must_not": [
            {
              "terms": {
                "extension": [
                  "docx",
                  "doc"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

必须做什么:

为了拥有必须存在的条款和需要过滤的条款,bool查询最适合。

  • 必须查询存储OP查询中存在的所有子句
  • Must_not查询应存储所有需要过滤的扩展程序

答案 1 :(得分:2)

如果要返回与“.doc”或“.xls”匹配的项目,则需要TERMS查询。这是一个示例:

        var searchResult = ElasticClient
            .Search<SomeESType>(s => s
                .Query(q => q
                    .Filtered(fq => fq
                        .Filter(f => f
                            .Terms(t => t.Field123, new List<string> {".doc", ".xls"})
                        )
                    )
                )
            )