Elasticsearch使用IK分词器的坑

Elasticsearch使用IK分词器

定义实体指定index,type,分片数量

IK分词器分类:ik_smart(粗粒度),ik_max_word(细粒度)
注意: es版本为7.0.0以下的不支持ik_max_word7.0.0以下的仅支持ik_smart分词器

具体使用方式如下:

@Data
@Document(indexName = "entertainment_idx_sole", type = "culture_data", shards = 3)
public class SearchEntity {
    @Field(type = FieldType.Keyword)
    private String id;
    /**
     * 类型,精确查询
     */
    @Field(type = FieldType.Keyword)
    private String type;
    @Field(type = FieldType.Keyword)
    private String obj_id;//private Integer objId;
    /**
     * 标题
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String title;
    /**
     * 豆瓣评分
     */
    @Field(type = FieldType.Text)
    private String db_score; //private Float dbScore;
    /**
     * 原名
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String original_name;
    /**
     * 人名
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String people_name;
    /**
     * 简介
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String intro;
    /**
     * 品牌类型
     */
    @Field(type = FieldType.Text)
    private String brand_type;
    /**
     * 主演作品数
     */
    @Field(type = FieldType.Text)
    private String starring_works_num;//private Integer starringWorksNum;
    /**
     * 代表作
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String masterpiece;
}

es组合条件查询,并指定查询权重:

private BoolQueryBuilder getQueryBuilder(String keyword, String type) {
        MultiMatchQueryBuilder multiMatchQuery =
                QueryBuilders.multiMatchQuery(keyword,
                        "intro",
                        "title",
                        "original_name",
                        "people_name",
                        "db_score",
                        "publishing_house_name",
                        "masterpiece").field("title", 2.0f).field("intro", 1.5f);
        if (!ALL.equals(type)) {
            return QueryBuilders.boolQuery()
                    .must(QueryBuilders.termsQuery("type", type))
                    .must(multiMatchQuery);
        } else {
            return QueryBuilders.boolQuery().must(multiMatchQuery);
        }
    }

/**
     * QueryBuilders.matchQuery("originalName", keyword).boost(2.0f)设置权重
     *
     * @param type    查询类别
     * @param keyword 查询关键字
     * @return 结果
     */
    public List<SearchResponseVo> searchEntities(String type, String keyword) {
        try {
            BoolQueryBuilder queryBuilder = getQueryBuilder(keyword, type);
            Pageable pageable = PageRequest.of(0, 100);
            Iterable<SearchEntity> searchEntities = entertainmentSearchDao.search(queryBuilder, pageable);
            return searchResponseVos(Lists.newArrayList(searchEntities));
        } catch (Exception e) {
            log.error("searchEntities error:", e);
            throw new RuntimeException(e);
        }
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值