以下JSON是我需要MVC NEST发送的请求:
{
"query": {
"multi_match": {
"text": {
"fields": "_all",
"query": "monelo",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
}
这是发送的JSON,(缺少文本节点,为了获得模糊的结果,这似乎是至关重要的。)
{
"query": {
"multi_match": {
"fields": "_all",
"query": "monelo",
"fuzziness": "AUTO",
"operator": "and"
}
}
}
生成上述JSON并按照请求发送:
var productsQuery =
client.Search<Elastic.Product>(s => s.Index(indexName).Type("products").Query(q => q.QueryString(qstr => qstr
.Fields("_all")
.Fuzziness(Fuzziness.Auto)
.Query("*" + query + "*")))
.Size(100));
我使用Fiddler调试,如果我添加文本节点,那么我会得到所需的结果。
所以,我要么做得不对,要么我正在使用的NEST客户端不是最新的Elasticsearch REST规范。
我花了几个小时,如果不是一天研究文档,我确实尝试了每种查询类型和每个属性。
还尝试使用LowLevelClient发送带有原始json的请求,但这不允许我将检索到的结果反序列化为多个Elastic.Product对象。
答案 0 :(得分:0)
使用Bool查询解决,使用must和should子句。
var productsQuery =
client.Search<Elastic.Product>(s => s.Index(indexName).Type("products").Query(q => q.Bool(b =>
b.Must(mq => mq.Fuzzy(f => f.Field("_all").Value(query.ToLower()).Fuzziness(Fuzziness.Auto)))
.Should(sq => sq.QueryString(sqqs => sqqs.DefaultField("_all").Query("*" + query.ToLower() + "*")))))
.From(0)
.Size(100)
.Sort(ss => ss.Field(f => f.Field("displayName"))));