4

我想知道是否有人对在 NEST 中使用 SearchBuilder API 有任何提示或示例。文档仍然有点稀疏。

我希望根据 URL 参数中发送的条件动态构建查询/过滤器。一个例子:

www.mydomain.com/things/search?prop1=3&prop2=foo&prop3=bar

一旦我提取了那些,我想根据现有的标准构建一个完全匹配的查询。

4

2 回答 2

3

使用 DSL 查询语法,您现在可以简单地执行以下操作:

var results = client.Search(s=>s
    .Fields(new string[0])
    .Query(q=>
        q.Term(ESFields.City, city)
        && q.Term(ESFields.State, state)
    )
);

这依赖conditionless query于 0.9.10.0 中添加的支持。

city如果持有值,这将只呈现城市查询,如果state不为空或不为空,则只会呈现州术语查询。

  • 如果两者都有效,它将执行布尔查询
  • 如果只有一个有效,它将只执行一项查询
  • 如果两者都无效,它将回退到 match_all 查询。
于 2012-12-02T21:04:43.140 回答
0

这就是我最终这样做的方式:

  var boolQuery = QueryFactory.BoolQuery();
  if (!String.IsNullOrEmpty(city)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.City, city)); }
  if (!String.IsNullOrEmpty(state)) { boolQuery.Must(QueryFactory.TermQuery(ESFields.State, state)); }
  //etc. for many fields

  var sb = SearchBuilder.Builder();
  //I want no actual data - this will ensure I only get IDs
  sb.Fields(new string[0]);
  sb.Query(boolQuery);

  var companyIds = ((ElasticClient)_elasticClient).Search(sb, ESIndexes.Client, ESIndexTypes.Client, tenantId)
    .DocumentsWithMetaData.Select(d => d.Id).ToList();

不确定这是最有效/最有效的方法,但它确实有效。

于 2012-10-05T15:58:19.510 回答