c# - 在Elasticsearch NEST中的主要多重匹配查询之后应用不同的过滤器

标签 c# elasticsearch nest

因此,这是我的查询:

_elasticClient.Search<SearchItem>(x =>
                x.Sort(sort).Size(itemsPerPage)
                .Query(q =>
                    q.MultiMatch(m => m
                    .Fields(fs => fs
                        .Field(p => p.Field1)
                        .Field(p => p.Field2)
                        .Field(p => p.Field3)
                        .Field(p => p.Field4)
                        .Field(p => p.Field5)
                        .Field(p => p.Field6)                            
                    )
                    .Operator(Operator.And)
                    .Query(pattern)
                )));

我必须应用不同的过滤器。范围过滤器(用于价格),过滤结果集,其中field1 =“Audi”和field2 =“Sale Car”。我试图做这样的事情:
.Query(q =>
                    q.MultiMatch(m => m
                    .Fields(fs => fs
                        Field(p => p.Field1)
                            .Field(p => p.Field2)
                            .Field(p => p.Field3)
                            .Field(p => p.Field4)
                            .Field(p => p.Field5)
                            .Field(p => p.Field6)  
                    )
                    .Operator(Operator.And)
                    .Query(pattern)))
.Query(q=>q.Range(ra=>ra.Field(ff=>ff.SalePrice).GreaterThan(1000))));

但这是行不通的。我已经从价格大于1000的索引中获得了所有结果,但只需要搜索结果。有人可以帮我吗?

最佳答案

您可以 use a bool query to combine queries ,而NEST可以通过重载运算符来组合QueryContainer(根查询类型)来使其更容易使用。这是NEST 2.x的示例

void Main()
{
    var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
    var settings = new ConnectionSettings(connectionPool);

    var client = new ElasticClient(settings);

    var itemsPerPage = 20;
    var pattern = "match query";

    client.Search<SearchItem>(x => x
        .Sort(so => so
            .Descending("_score")
        )
        .Size(itemsPerPage)
        .Query(q => q
            .MultiMatch(m => m
                .Fields(fs => fs
                    .Field(p => p.Field1)
                    .Field(p => p.Field2)
                    .Field(p => p.Field3)
                    .Field(p => p.Field4)
                    .Field(p => p.Field5)
                    .Field(p => p.Field6)
                )
                .Operator(Operator.And)
                .Query(pattern)
            ) && q
            .Range(ra => ra
                .Field(ff=>ff.SalePrice)
                .GreaterThan(1000)
            )
        )
    );
}

public class SearchItem
{
    public int SalePrice { get; set; }

    public string Field1 { get; set; }

    public string Field2 { get; set; }

    public string Field3 { get; set; }

    public string Field4 { get; set; }

    public string Field5 { get; set; }

    public string Field6 { get; set; }
}

产生
{
  "size": 20,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "match query",
            "operator": "and",
            "fields": [
              "field1",
              "field2",
              "field3",
              "field4",
              "field5",
              "field6"
            ]
          }
        },
        {
          "range": {
            "salePrice": {
              "gt": 1000.0
            }
          }
        }
      ]
    }
  }
}

这将查找与multi_match查询匹配并且salePrice大于1000的文档。由于我们不需要为范围查询计算分数(文档的salePrice大于1000或没有) ,范围查询可以在过滤器上下文中运行。略有改进的版本
client.Search<SearchItem>(x => x
    .Sort(so => so
        .Descending("_score")
    )
    .Size(itemsPerPage)
    .Query(q => q
        .MultiMatch(m => m
            .Fields(fs => fs
                .Field(p => p.Field1)
                .Field(p => p.Field2)
                .Field(p => p.Field3)
                .Field(p => p.Field4)
                .Field(p => p.Field5)
                .Field(p => p.Field6)
            )
            .Operator(Operator.And)
            .Query(pattern)
        ) && +q
        .Range(ra => ra
            .Field(ff=>ff.SalePrice)
            .GreaterThan(1000)
        )
    )
);

将一元+运算符附加到范围查询是 bool(boolean) 查询过滤器的简写。查询json现在看起来像
{
  "size": 20,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "match query",
            "operator": "and",
            "fields": [
              "field1",
              "field2",
              "field3",
              "field4",
              "field5",
              "field6"
            ]
          }
        }
      ],
      "filter": [
        {
          "range": {
            "salePrice": {
              "gt": 1000.0
            }
          }
        }
      ]
    }
  }
}

关于c# - 在Elasticsearch NEST中的主要多重匹配查询之后应用不同的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38683557/

相关文章:

C# 线程 -ThreadStart 委托(delegate)

elasticsearch - 如何在Kibana仪表板上的发现页面中包含日志

mongodb - 如何修复 connection refused and can't find a master error on elasticsearch mongoriver

c# - ElasticSearch 索引上的自定义属性

.net - IncludeInAll(...)的替代品是什么?

c# - C# 编译器是否将 Color Color 规则错误地用于 const 类型成员?

c# - 如何为最小起订量中的属性赋值?

c# - NEST 按文本字段排序

c# - SandcaSTLe 设置 - 网页导航已取消

elasticsearch - 如何在ElasticSearch中获取倒排索引的大小