Es开发实例

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

配置:

elasticsearch_setting.json

{
    "index": {
        "number_of_shards": "5",
        "max_result_window": "200000000",
        "max_ngram_diff": 20,
        "analysis": {
            "analyzer": {
                "ik_pinyin_analyzer": {
                    "type": "custom",
                    "max_token_length": "1",
                    "tokenizer": "ik_smart",
                    "filter": "pinyin_filter"
                },
                "pinyin_analyzer": {
                    "tokenizer": "pinyin_tokenizer"
                },
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "my_tokenizer",
                    "filter": ["lowercase"]
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "ngram",
                    "min_gram": 1,
                    "max_gram": 1,
                    "token_chars": [
                        "letter",
                        "digit"
                    ]
                },
                "standard_tokenizer": {
                    "type": "standard",
                    "max_token_length": "1"
                },
                "pinyin_tokenizer": {
                    "ignore_pinyin_offset": "true",
                    "keep_joined_full_pinyin": "true",
                    "keep_none_chinese_in_first_letter": "true",
                    "lowercase": "true",
                    "keep_none_chinese_together": "true",
                    "remove_duplicated_term": "true",
                    "keep_first_letter": "true",
                    "keep_separate_first_letter": "true",
                    "trim_whitespace": "true",
                    "type": "pinyin",
                    "keep_none_chinese": "true",
                    "keep_full_pinyin": "true"
                }
            },
            "filter": {
                "pinyin_filter": {
                    "type": "pinyin",
                    "keep_first_letter":true,
                    "keep_separate_first_letter": false,
                    "keep_full_pinyin": true,
                    "keep_original": false,
                    "limit_first_letter_length": 10,
                    "lowercase": true,
                    "remove_duplicated_term": true,
                    "ignore_pinyin_offset": "true",
                    "keep_joined_full_pinyin": "true",
                    "keep_none_chinese_in_first_letter": "true",
                    "keep_none_chinese_together": "true",
                    "trim_whitespace": "true",
                    "keep_none_chinese": "true"

                }
            }
        }
    }
}

elasticsearch_mapping.json

{
    "properties": {
        "proName": {
            "type": "text",
            "analyzer": "my_analyzer",
            "search_analyzer": "my_analyzer",
            "fields": {
                "keyword": {
                    "type": "keyword"
                },
                "pinyin": {
                    "type": "text",
                    "analyzer": "pinyin_analyzer"
                }
            }
        },
        "barCodes": {
            "type": "text",
            "analyzer": "my_analyzer",
            "search_analyzer": "my_analyzer",
            "fields": {
                "keyword": {
                    "type": "keyword"
                }
            }
        },
        "group": {
            "type": "nested"
        }
       
    }
}

实体类


@Data
@Mapping(mappingPath = "elasticsearch_mapping.json")//设置mapping
@Setting(settingPath = "elasticsearch_setting.json")//设置setting
@Document(indexName = "#{@proTableName}")
public class EsProduct implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private Long id;

    /**
     * 店铺id  
     */
    @Field(name = "shopId", type = FieldType.Long)
    private Long shopId;

    /**
     * 条形码集 用逗号隔开
     * Field 复杂分词功能用json配置
     */
    private String barCodes;
 
    /**
     * 总销量
     */
    @Field(name = "proSaleTotal", type = FieldType.Integer)
    private Integer proSaleTotal;
  
    /**
     * 商家编码
     */
    @Field(name = "proCode", type = FieldType.Text)
    private String proCode;
    /**
     * 条形码
     */
    @Field(name = "barCode", type = FieldType.Text)
    private String barCode;
    /**
     * 商品名称
     * Field 复杂分词功能用json配置
     */
    private String proName;
    /**
     * 商品描述
     */
    @Field(name = "proDescribe", type = FieldType.Text)
    private String proDescribe;
 
     
    /**
     * 卖家id  
     */
    @Field(name = "userId", type = FieldType.Long)
    private Long userId;
    /**
     * 创建时间
     */
    @Field(type = FieldType.Date, format = DateFormat.date_optional_time)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8")
    private Date createTime;
    /**
     * 修改时间
     */
    @Field(type = FieldType.Date, format = DateFormat.date_optional_time)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8")
    private Date editTime;
   
   
   @Field(name = "isDelete", type = FieldType.Integer)
    private Integer isDelete;
 
 
    @Field(name = "proLabel", type = FieldType.Text)
    private String proLabel;
    
    @Field(name = "proLabel", type = FieldType.Double)
    private BigDecimal proWeight;
  
    @Field(type = FieldType.Nested)
    private List<EsProGroup> group;

   
}

Daon层

@Repository
public interface EsProductDAO extends ElasticsearchRepository<EsProduct, Long> {
List<EsProduct> findByProNameLike(String proName);
List<EsProduct> findByShopIdOrderByCreateTimeDesc(Long shopId);
List<EsProduct> findByShopId(Long shopId, Pageable pageable);
List<EsProduct> findByIdIn(List<Long> proIds);
}

Serviice层

private final EsProductDAO esProductDAO;
  esProductDAO.save(product);
 Page<EsProduct> search(NativeSearchQuery searchQuery);

Page<EsProduct> page = esProductService.search(this.paramsConvert(proSearBasicBO).build());
public NativeSearchQueryBuilder paramsConvert(BeEsProSearchBO.ProSearchEsBO proSearBasicBO) {
        log.info("ES搜索条件参数:{}", JSON.toJSONString(proSearBasicBO));
        // 复合查询
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        if (CommonUtil.isNotEmpty(proSearBasicBO.getBusId())) {
            boolQuery.filter(QueryBuilders.termQuery("userId", proSearBasicBO.getBusId()));
        }
        
        if (CommonUtil.isNotEmpty(proSearBasicBO.getShowSoldOut()) && (proSearBasicBO.getShowSoldOut() == -1 || proSearBasicBO.getShowSoldOut() == 0)) {
            RangeQueryBuilder stockTotal = QueryBuilders.rangeQuery("proStockTotal").gt(0);
            TermQueryBuilder isJxcMinusStock = QueryBuilders.termQuery("isJxcMinusStock", 1);
            BoolQueryBuilder stockTotalQuery = QueryBuilders.boolQuery().must(stockTotal).should(isJxcMinusStock);
            boolQuery.filter(stockTotalQuery);
        }
        if (CommonUtil.isNotEmpty(proSearBasicBO.getBarCode())) {
            boolQuery.must(QueryBuilders.queryStringQuery(proSearBasicBO.getBarCode()).field("barCodes"));
        }
        if (CommonUtil.isNotEmpty(proSearBasicBO.getGroupId()) && proSearBasicBO.getGroupId() > 0) {
            boolQuery.must(QueryBuilders.nestedQuery(EsTableNameConstant.GROUP, QueryBuilders.termQuery(EsTableNameConstant.GROUP + ".groupId", proSearBasicBO.getGroupId()), ScoreMode.None));
        }
        if (proSearBasicBO.getGroupIds() != null && proSearBasicBO.getGroupIds().size() > 0) {
            boolQuery.must(QueryBuilders.nestedQuery(EsTableNameConstant.GROUP, QueryBuilders.termsQuery(EsTableNameConstant.GROUP + ".groupId", proSearBasicBO.getGroupIds()), ScoreMode.None));
        }
       
        if (CommonUtil.isNotEmpty(proSearBasicBO.getSearch())) {
            String query = CommonUtil.escape(proSearBasicBO.getSearch());
            if (proSearBasicBO.getSearchKey().equals(2)) { 
                QueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("barCodes", query).slop(0).boost(70);
                MatchQueryBuilder barCodeBuilder = QueryBuilders.matchQuery("barCodes", query).boost(1);
                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery().should(barCodeBuilder).should(matchPhraseQueryBuilder);
                boolQuery.must(shouldQuery);
            } else if (proSearBasicBO.getSearchKey().equals(1)) { 
                QueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery("proName", query).slop(0).boost(70);
                MatchQueryBuilder proNameBuilder = QueryBuilders.matchQuery("proName", query).boost(1);
                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery().should(matchPhraseQueryBuilder).should(proNameBuilder);
                boolQuery.must(shouldQuery);
            } else {
                QueryBuilder matchPhraseBuilder = QueryBuilders.matchPhraseQuery("proName", query).slop(0).boost(2);
                 MatchQueryBuilder proNameBuilder = QueryBuilders.matchQuery("proName", query).boost(1);

                QueryBuilder barPhraseBuilder = QueryBuilders.matchPhraseQuery("barCodes", query).slop(0).boost(500);
                MatchQueryBuilder barCodeBuilder = QueryBuilders.matchQuery("barCodes", query).boost(50);
                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery().should(matchPhraseBuilder).should(proNameBuilder).should(barCodeBuilder);
                boolQuery.must(shouldQuery);
            }
        }
        queryBuilder.withQuery(boolQuery);

        if (proSearBasicBO.getSortStyle() == null) {
            proSearBasicBO.setSortStyle(0);
        }
        
        //排序
        if (CommonUtil.isNotEmpty(proSearBasicBO.getSortStyle())) {
            if (proSearBasicBO.getSortStyle() == ProSortConstant.ID_DOWN) {
                if (proSearBasicBO.getActStyle() == 13) {
                    queryBuilder.withSort(new FieldSortBuilder(EsTableNameConstant.JXC_PRICE + ".createTime").order(SortOrder.DESC).setNestedPath(EsTableNameConstant.JXC_PRICE));
                    queryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));
                } else {
                    queryBuilder.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));
                }
            } else if (proSearBasicBO.getSortStyle() == ProSortConstant.SALE_DOWN) {
                queryBuilder.withSort(SortBuilders.fieldSort("proSaleTotal").order(SortOrder.DESC));
                if (proSearBasicBO.getActStyle() == 13) {
                    queryBuilder.withSort(new FieldSortBuilder(EsTableNameConstant.JXC_PRICE + ".createTime").order(SortOrder.DESC).setNestedPath(EsTableNameConstant.JXC_PRICE));
                } else {
                    queryBuilder.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC));
                }
            } 
        }

        // 分页
        if (CommonUtil.isNotEmpty(proSearBasicBO.getCurPage())) {
            if (proSearBasicBO.getCurPage() > 0) {
                proSearBasicBO.setCurPage(proSearBasicBO.getCurPage() - 1);
            }
            queryBuilder.withPageable(PageRequest.of(proSearBasicBO.getCurPage(), proSearBasicBO.getPageSize()));
        }
        log.info("ES搜索条件转成ES条件参数:{}", JSON.toJSONString(boolQuery.toString()));
        return queryBuilder;
    }
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于Elasticsearch的裸机单实例部署,你可以按照以下步骤进行操作: 1. 安装Java:确保你的机器上已经安装了Java Development Kit (JDK)。Elasticsearch需要Java来运行。你可以从Oracle官方网站上下载适合你操作系统的JDK版本,并按照官方文档进行安装。 2. 下载Elasticsearch:从Elasticsearch官方网站上下载适合你操作系统的Elasticsearch压缩包。你可以选择稳定版或预览版,根据你的需求选择相应版本。 3. 解压缩Elasticsearch:将下载的压缩包解压到你想要安装的目录。解压后的目录将包含Elasticsearch的所有文件。 4. 配置Elasticsearch:进入到解压后的目录,找到`config`文件夹。其中,`elasticsearch.yml`文件是主要的配置文件。你可以根据需要修改该文件,配置Elasticsearch的参数,例如集群名称、节点名称、监听地址等。 5. 启动Elasticsearch:打开终端或命令行界面,进入到Elasticsearch的安装目录。执行以下命令启动Elasticsearch: ``` bin/elasticsearch ``` 6. 验证Elasticsearch是否正常运行:在浏览器中访问`http://localhost:9200`,如果你看到返回的JSON格式数据,表示Elasticsearch已经成功启动。 7. 管理Elasticsearch:你可以使用Elasticsearch提供的RESTful API或者Kibana等工具来管理和操作Elasticsearch。例如,你可以创建索引、插入数据、执行搜索等操作。 请注意,裸机单实例部署只适用于开发和测试环境。在生产环境中,建议使用Elasticsearch集群来提高性能和可用性。此外,还需要注意安全性、监控和备份等方面的考虑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值