elasticsearch纯笔记

package com.example.demoes0.bean;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.math.BigDecimal;

@Document(indexName = "yproduct")
@Data
public class YProduct implements Serializable {
    private static final long serialVersionUID = -1L;

    @Id
    private Long id;
    @Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
    private String name;
    @Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
    private String subTitle;
    @Field(analyzer = "ik_max_word",type = FieldType.Text, searchAnalyzer = "ik_max_word")
    private String keywords;
    private Integer brandId;// 品牌
    private Integer categoryId;// 类别
    private Integer sale;// 销售数量
    private BigDecimal price;
}



=======================================

package com.example.demoes0.repository;

import com.example.demoes0.bean.YProduct;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface YProductRepository extends ElasticsearchRepository<YProduct, Long> {
}

========================================

package com.example.demoes0.service;

import com.example.demoes0.bean.YProduct;
import org.springframework.data.domain.Page;

public interface YProductService {

    Page<YProduct> search(String search, Integer brandId, Integer categoryId, Integer page, Integer limit);

    int importYProduct();

    YProduct add();
}



=========================================


package com.example.demoes0.service.impl;

import com.example.demoes0.bean.YProduct;
import com.example.demoes0.repository.YProductRepository;
import com.example.demoes0.service.YProductService;
import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class YProductServiceImpl implements YProductService {

    @Autowired
    private YProductRepository yProductRepository;

    @Override
    public Page<YProduct> search(String search, Integer brandId, Integer categoryId, Integer page, Integer limit) {

        // 不作空判断

        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();// 搜索

        // 分页
        PageRequest pageRequest = PageRequest.of(page, limit);
        nativeSearchQueryBuilder.withPageable(pageRequest);

        // 过滤品牌与类别等
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termQuery("brandId", brandId));
        boolQueryBuilder.must(QueryBuilders.termQuery("categoryId",categoryId));
        nativeSearchQueryBuilder.withFilter(boolQueryBuilder);

// 下面参考地址
        // 全部搜索
        // nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());

        // 搜索范围:商品名称、副标题、关键字 (权重)
        List<FunctionScoreQueryBuilder.FilterFunctionBuilder> filterFunctionBuilders = new ArrayList<>();
        filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("name", search), ScoreFunctionBuilders.weightFactorFunction(10)));
        filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("subTitle", search), ScoreFunctionBuilders.weightFactorFunction(7)));
        filterFunctionBuilders.add(new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("keywords", search), ScoreFunctionBuilders.weightFactorFunction(5)));

        FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(filterFunctionBuilders.stream().toArray(FunctionScoreQueryBuilder.FilterFunctionBuilder[] :: new)).scoreMode(FunctionScoreQuery.ScoreMode.SUM).setMinScore(2);// 小于等于1的没中
        nativeSearchQueryBuilder.withQuery(functionScoreQueryBuilder);

        // 排序:价格、销售数量、新品、搜索结果
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));// 新品
        // nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sale").order(SortOrder.DESC));// 销售数量 高 -> 低
        // nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("sale").order(SortOrder.ASC));// 销售数量 低 -> 高
        // nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));// 价格 高 -> 低
        // nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));// 价格 低 -> 高
        //nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));// 按原来的搜索结果排序
        //nativeSearchQueryBuilder.withSort(SortBuilders.scoreSort().order(SortOrder.DESC));
        NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
        return yProductRepository.search(nativeSearchQuery);
    }

    @Override
    public int importYProduct() {

        int number = 0;
        /*List<YProduct> list = new ArrayList<>();
        list.add(new YProduct(1L, "苹果手机8", "这是苹果第8款手机","苹果,8,IOS", 1, 2, 100, new BigDecimal("4567.88")));
        list.add(new YProduct(2L, "安卓手机小米", "这是安卓手机小米","安卓,小米", 2, 3, 300, new BigDecimal("2000.88")));
        list.add(new YProduct(3L, "安卓手机华为", "这是手机华为","华为,安卓", 2, 3, 200, new BigDecimal("2365.88")));

        Iterable<YProduct> yProducts = yProductRepository.saveAll(list);
        Iterator<YProduct> iterator = yProducts.iterator();

        while (iterator.hasNext()) {
            iterator.next();
            number++;
        }*/
        return number;
    }

    @Override
    public YProduct add() {
        return null;
    }

    // 删除
}
===================================
spring:
  data:
    elasticsearch:
      repositories:
        enabled: true
      cluster-nodes: 192.168.0.104:9300

===================不断补充==================
新版用elasticsearchRestTemplate
SearchHits<Product> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, Product.class);
SearchPage<Product> page = SearchHitSupport.searchPageFor(searchHits, nativeSearchQuery.getPageable());

部分资料

参考:https://github.com/guass/macrozheng-mall/blob/master/mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java

参考:https://blog.csdn.net/laoyang360/article/details/82950393

参考:https://blog.csdn.net/wojiushiwo987/category_9266239.html

参考:https://www.programcreek.com/java-api-examples/?api=org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders

参考:https://blog.51cto.com/15082397/2590638?source=dra

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值