c# - ElasticSearch NEST 完成建议过滤器
问题描述
目前正在从事一个涉及车辆数据库的项目。
我们设置了一些过滤器供最终用户选择,例如底盘、变速箱、价格。按预期工作现在我们正在尝试在搜索字段中实现自动完成功能。由于简单的查询字符串需要完整的型号名称和/或品牌名称,因此我已经研究了完成情况,这适用于未完成的品牌名称,即:“tesl”将建议相应的特斯拉型号。
我正在努力的是在指定的查询中获取建议。
谢谢!
解决方案:不确定这是否是解决问题的正确方法,但我只是使用建议的 id 运行主查询以获取完整的有效负载,以获取文本搜索所需的所有数据。
var result = await _client.SearchAsync<Models.VehicleModel>(descriptor => descriptor
.Index("vehiclemodel")
.Query(
q =>
q
.Terms(t => t
.Name("ModelName")
.Field("modelName")
.Terms(searchArguments.Models)
)
&&
q
.Terms(t => t
.Name("BrandName")
.Field("brandName")
.Terms(searchArguments.Brands)
)
&&
q
.Range(t => t
.Name("Price")
.Field("modelMinimumPrice")
.GreaterThanOrEquals(searchArguments.MinPrice)
.LessThanOrEquals(searchArguments.MaxPrice)
)
&&
q
.SimpleQueryString(c => c
.Name("textquery")
.Query(searchArguments.Query)
.Boost(2)
.Fields(f => f
.Field(p => p.BrandName + "^2")
.Field(p => p.ModelName + "^2")
.Field(p => p.EnergySource)
.Field("*")
)
)
public async Task<dynamic> GetModelSearchSuggestions(SearchArguments searchArguments = default)
{
var result = await _client.SearchAsync<dynamic>(s => s
.Index("vehiclemodel")
.Suggest(su => su
.Completion("searchsuggest", cs => cs
.Field("suggest")
.Prefix(searchArguments.Query)
.Fuzzy(f => f
.Fuzziness(Fuzziness.Auto)
)
)
)
);
return result.Suggest;
}
mappingDescriptor
.Properties(p => p
.Completion(cp => cp
.Name("suggest")
.Analyzer("standard")
.SearchAnalyzer("standard")
)
.Text(t => t.Name("modelName").Fielddata(true))
.Text(t => t.Name("brandName").Fielddata(true))
);
解决方案
推荐阅读
- go - 不能在字段值中使用 1(类型 int)作为类型 *int
- swift - 用多个不同的替换替换多个不同的出现 - Swift4.2
- mysql - 在 CakePHP 3 中进行深度 notMatching() 关联的正确方法是什么
- r - 强制 dbGetQuery 生成字符串
- c# - .NET 是否有 IComparer 的忽略大小写的实现
? - java - 使用 POSTMAN 向所有用户发送 FCM 通知
- c++ - 包含函数指针的类可以用作非类型模板参数吗?
- mysql - 你如何只返回包含 MySQL 中特定值的组?
- swift - 如何快速将参数传递给选择器?
- reactjs - 需要在 useCallback 中包装每个 useMemo 依赖项