使用嵌套弹性搜索客户端生成带有命名字段的QueryString

时间:2014-06-24 11:43:46

标签: elasticsearch nest

我目前正在使用Nest弹性clien,因此请运行如下基本搜索词:

.Query(q => q.QueryString(qs=>qs.Query("user search term")));

我还将这些基本搜索字词与facet过滤器结合使用,如下所示:

.Query(
    q => q.QueryString(qs => qs.Query("user search term"))
    && q.Terms(t => t.Brand, new string[] {"brand1", "brand2"})
    && q.Terms(t => t.Colour, new string[] {"blue", "black"})
    && q.Range(r => r.From(50).To(100).OnField(f => f.Price))
);

但是我努力运行适用于特定字段的自定义查询字符串搜索。 搜索查询字符串将被传递到我的应用程序,因此我不知道我搜索的特定字段,所以我不能在客户端上使用.OnField()方法

例如,希望能够传递一个同时按品牌,性别和颜色搜索的查询字符串。从查看Elastic搜索查询DSL我想我应该能够传入一个查询字符串来命名字段,如下所示:

.Query(q => q.QueryString(qs => qs.Query("brand:brand1 AND gender:male AND colour(blue)")));

但这不起作用并且不会返回任何结果。如何生成查询字符串以在Nest客户端的特定字段上搜索?

还有什么方法可以从嵌套SearchDescriptor查看生成的查询?

1 个答案:

答案 0 :(得分:0)

您可以使用布尔查询

List<QueryContainer> shoudQuery = new List<QueryContainer>();

shoudQuery.Add(new MatchQuery()
    {
       Field = "brand",
       Query = "brand1",    
    });
shoudQuery.Add(new MatchQuery()
    {
       Field = "gender",
       Query = "male",    
    });
shoudQuery.Add(new MatchQuery()
    {
       Field = "colour",
       Query = "blue",    
    });


QueryContainer queryContainer = new BoolQuery
        {
             Should = shoudQuery.ToArray(),
             Must = new QueryContainer[] { new MatchAllQuery() },
             MinimumShouldMatch = 3,

         };


var result = Client.Search(s => s.Size(resultSize).Query(q => queryContainer)
  1. 如果您想要3并=> MinimumShouldMatch = 3
  2. 如果要3之2 => MinimumShouldMatch = 2

    ...