在用es做搜索时通常会遇到很多条件过滤查询,以及一些复杂的请求参数过滤。
简单以一组数据类型举例。请求参数为: {关键字:关键字,品牌:品牌,分类:分类,规格:{规格1:规格1,规格2:规格2...} }
在query处理时当然用组合查询boolQueryBuild进行组合
处理关键字时,关键字可分词
boolQueryBuild.must(QueryBuilders.queryStringQuery("关键字").filed("列名"))
处理品牌和分类时,品牌和分类不分词
boolQueryBuild.must(QueryBuilders.termQuery("索引列名","value"))
因为规格参数特殊为list集合
因为规格参数并没有特殊标识,所以我们在请求参数端需要做区分,将是规格参数的过滤条件,在条件前加spec_做区分,原本过滤条件为规格1=规格1 --》 spec_规格1=规格1.
在后端处理时,对条件Map遍历,
if(searchString.startwith("spec")){
索引列名 searhmap.规格1.keyword
boolQueryBuild.must(QueryBuilders.termQuery("searhmap"+规格1.subString(6)+"keyword","value"))
}
关于价格匹配
boolQueryBuild.must(QueryBuilders.rangeQuery(“索引列名”).gt(Integer))
boolQueryBuild.must(QueryBuilders.rangeQuery(“索引列名”).lte(Integer))
分页
nativeSearchQueryBuilder.withPageable(PageRequest.of(page-1,size));