elasticsearch 复杂查询

发布日期:2022-11-23 16:43:18
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("valid", "1"));
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("verifyStatus", "1"));
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("publishStatus", "1"));
        boolQueryBuilder.must(QueryBuilders.rangeQuery("startDt").to(new Date()));
        boolQueryBuilder.must(QueryBuilders.rangeQuery("endDt").from(new Date()));


        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("shopsId", "2aa9ccbf-2bd2-49f8-bcf9-57cb28995a29"));


        boolQueryBuilder.must(QueryBuilders.wildcardQuery("title", "*hujs*"));
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("providerName", "测试hujs"));
        boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("categoryId", "35f496c2-bb76-4f8b-9df1-20e0a291a1cd"));


        BoolQueryBuilder boolQueryBuilderNested = new BoolQueryBuilder();
        boolQueryBuilderNested.must(QueryBuilders.matchPhraseQuery("listAttr.attrName", "服务性质"));
        boolQueryBuilderNested.must(QueryBuilders.matchPhraseQuery("listAttr.attrValue", "包干"));
        boolQueryBuilder.must(QueryBuilders.nestedQuery("listAttr", boolQueryBuilderNested, ScoreMode.None));


        Sort sort = Sort.by("overallScore").descending();
        Pageable pageable = PageRequest.of(0, 1);


        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withSort(sort)
                .withPageable(pageable)
                .build();


        return elasticsearchRestTemplate.search(nativeSearchQuery, Product.class);


/**
 * @author :zhuyun
 */
@Schema(title = "ES商品实体类")
@Data
@Document(indexName = "zlx-product",createIndex = true)
public class Product implements Serializable {
    @Id
    private String id;


    @Field(type = FieldType.Keyword)
    private String shopsId;


    @Field(type = FieldType.Text)
    private String shopsName;


    @Field(type = FieldType.Keyword)
    private String providerId;


    @Field(type = FieldType.Keyword)
    private String providerName;


    @Field(type = FieldType.Keyword)
    private String categoryId;


    @Field(type = FieldType.Keyword)
    private String categoryName;


    @Field(type = FieldType.Text,analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String title;


    @Field(type = FieldType.Date, format = {}, pattern = "uuuu-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis")
    private Date startDt;


    @Field(type = FieldType.Date, format = {}, pattern = "uuuu-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis")
    private Date endDt;


    @Field(type = FieldType.Keyword)
    private String publishStatus;


    @Field(type = FieldType.Keyword)
    private String verifyStatus;


    @Field(type = FieldType.Date, format = {}, pattern = "uuuu-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis")
    private Date verifyDt;


    @Field(type = FieldType.Double)
    private BigDecimal price;


    @Field(type = FieldType.Keyword)
    private String valid;


    @Field(type = FieldType.Keyword)
    private String deleteId;


    @Field(type = FieldType.Date, format = {}, pattern = "uuuu-MM-dd HH:mm:ss||strict_date_optional_time||epoch_millis")
    private Date insertDt;


    @Field(type = FieldType.Long)
    private Long overallScore = 0L;


    @Field(type = FieldType.Long)
    private Long hotScore = 0L;


    @Field(type = FieldType.Long)
    private Long saleCount = 0L;


    @Field(type = FieldType.Long)
    private Long commentScore = 0L;


    @Field(type = FieldType.Text)
    private String imgUrl;


    @Field(type = FieldType.Nested)
    private List<SpuAttribute> listAttr;


    @Data
    public static class SpuAttribute {


        @Field(type = FieldType.Keyword)
        private String attrId;


        @Field(type = FieldType.Keyword)
        private String attrName;


        @Field(type = FieldType.Keyword)
        private String attrValueId;


        @Field(type = FieldType.Keyword)
        private String attrValue;


        @Field(type = FieldType.Integer)
        private Integer sort;
    }


}