NEST 匹配查询问题
NEST Match Query Issue
我目前正在为电话数据库开发 NEST 搜索器。就制作动态版本而言,我运气不佳,因此用户可以过滤某些术语以在前端搜索。
这是因为 NEST 不喜欢用变量替换字段 "f.something"。由于这个原因,我已经转向静态,因为我相信我可以通过一些对象实例化来做到这一点。
但是,现在即使我收到有效的 NEST 响应,它们也总是空的,即使显然有一个结果。比如"Name"表示字段,"iPhone"表示查询。我错过了什么?提前致谢。
P.S。注释掉的代码曾经有 "bool" 和 "should" 签入,但同样我一直没有得到任何结果。
private ISearchResponse<MasterProduct> SearchThis(ElasticClient client, string query, string field, int pageSize, int recordNumber)
{
var searchLayout = new SearchRequest<MasterProduct>
{
Size = pageSize,
From = recordNumber,
Query = new MatchQuery
{
Field = field,
Query = query,
Fuzziness = Fuzziness.Auto,
PrefixLength = 2,
Lenient = true,
FuzzyRewrite = MultiTermQueryRewrite.TopTermsBlendedFreqs(10)
}
};
var searchResponse = client.Search<MasterProduct>(searchLayout);
return searchResponse;
}
/*var searchResponse = client.Search<MasterProduct>(s => s
.From(recordNumber)
.Size(pageSize)
.Query(q => q
.Match(a => a
.Field(f => f.MasterProductName)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
.Match(b => b
.Field(f => f.ManufacturerName)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
.Match(c => c
.Field(f => f.MasterAttributes)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
)
);
Console.WriteLine(searchResponse.Hits.Count());
foreach (var hit in searchResponse.Documents)
{
Console.WriteLine(hit.MasterProductId);
}*/
}
@RussCam 回答了上面评论中的问题。
重申一下,仅将字符串作为参数传递给字段,而不是其他数据类型。
Camelcase 也是这个工作所必需的。
我目前正在为电话数据库开发 NEST 搜索器。就制作动态版本而言,我运气不佳,因此用户可以过滤某些术语以在前端搜索。
这是因为 NEST 不喜欢用变量替换字段 "f.something"。由于这个原因,我已经转向静态,因为我相信我可以通过一些对象实例化来做到这一点。
但是,现在即使我收到有效的 NEST 响应,它们也总是空的,即使显然有一个结果。比如"Name"表示字段,"iPhone"表示查询。我错过了什么?提前致谢。
P.S。注释掉的代码曾经有 "bool" 和 "should" 签入,但同样我一直没有得到任何结果。
private ISearchResponse<MasterProduct> SearchThis(ElasticClient client, string query, string field, int pageSize, int recordNumber)
{
var searchLayout = new SearchRequest<MasterProduct>
{
Size = pageSize,
From = recordNumber,
Query = new MatchQuery
{
Field = field,
Query = query,
Fuzziness = Fuzziness.Auto,
PrefixLength = 2,
Lenient = true,
FuzzyRewrite = MultiTermQueryRewrite.TopTermsBlendedFreqs(10)
}
};
var searchResponse = client.Search<MasterProduct>(searchLayout);
return searchResponse;
}
/*var searchResponse = client.Search<MasterProduct>(s => s
.From(recordNumber)
.Size(pageSize)
.Query(q => q
.Match(a => a
.Field(f => f.MasterProductName)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
.Match(b => b
.Field(f => f.ManufacturerName)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
.Match(c => c
.Field(f => f.MasterAttributes)
.Query(query)
.Fuzziness(Fuzziness.Auto)
.PrefixLength(2)
.Fuzziness(Fuzziness.Auto)
.Lenient()
.FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
)
)
);
Console.WriteLine(searchResponse.Hits.Count());
foreach (var hit in searchResponse.Documents)
{
Console.WriteLine(hit.MasterProductId);
}*/
}
@RussCam 回答了上面评论中的问题。 重申一下,仅将字符串作为参数传递给字段,而不是其他数据类型。 Camelcase 也是这个工作所必需的。