Elasticsearch NEST C#语法错误:单查询中同时使用Wildcard与MultiMatch
解决NEST中Bool.Should同时使用MultiMatch和Wildcard的语法问题
你遇到的是NEST客户端链式调用的上下文错误问题——当你在.Should里写完.MultiMatch之后,代码的上下文已经切换到了MultiMatchQueryDescriptor,而不是继续停留在可以添加更多查询子句的BoolQueryDescriptor环境里,所以后面的.Wildcard方法会找不到定义。
修复后的代码
你只需要把两个查询子句作为独立的参数传给.Should方法即可,用逗号分隔每个lambda表达式:
.Query(q => q .Bool(b => b .Should( // 第一个子句:MultiMatch查询 m => m.MultiMatch(ma => ma .Fields(f => f .Field("_id") .Field("elements.location.city") .Field("ticket_number") ) .Query(query) ), // 第二个子句:Wildcard查询 c => c.Wildcard(w => w .Field("name") .Value(query.ToLower() + "*") ) ) ) )
问题原因详解
NEST的BoolQueryDescriptor.Should方法支持接收多个QueryContainer类型的参数,每个参数对应一个要加入Should逻辑的查询。你之前的写法是把.MultiMatch和.Wildcard链式拼接,导致写完.MultiMatch后,代码的上下文变成了MultiMatchQueryDescriptor(这个类型没有.Wildcard方法),而不是继续在BoolQueryDescriptor的Should上下文里添加新的子句。
把两个查询拆成独立的lambda参数传入Should后,每个查询都在正确的上下文里构建,就能避免这个编译错误了。
另外,如果你需要更灵活的写法(比如动态添加多个Should子句),也可以用.Should().Add(...)的方式逐个添加查询:
.Query(q => q .Bool(b => b .Should(m => m.MultiMatch(ma => ma .Fields(f => f .Field("_id") .Field("elements.location.city") .Field("ticket_number") ) .Query(query) )) .Should(c => c.Wildcard(w => w .Field("name") .Value(query.ToLower() + "*") )) ) )
这两种写法效果是一致的,选你觉得更易读的即可。
内容的提问来源于stack exchange,提问作者Nubtacular
相关产品推荐
相关产品推荐

