elasticsearch 中獲得 分詞匹配 +(or) 全詞模糊匹配 的查詢結果(boolQuery)

 @Override
    public Response selectStructuredDataList(StructuredDataDTO structuredDataDTO) {
        StructuredDataTypeEnum structuredDataTypeEnum = StructuredDataTypeEnum.getByStructuredType(structuredDataDTO.getStructuredType());
        // 是否需要中轉到ai庫中
        if(structuredDataTypeEnum !=null && structuredDataTypeEnum.isAi()){
                BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
                if(StringUtils.isNotBlank(structuredDataDTO.getStructuredName())) {
                    // 獲得分詞或者全詞模糊匹配的boolQuery
                    boolQueryBuilder.must(getOrBoolQuery("minSymptom", structuredDataDTO.getStructuredName()));
                }
                if (structuredDataTypeEnum.getBiOneClassify() != null) {
                    boolQueryBuilder.must(QueryBuilders.termQuery("oneClassify", structuredDataTypeEnum.getBiOneClassify()));
                }
                if (structuredDataTypeEnum.getBiTwoClassify() != null) {
                    boolQueryBuilder.must(QueryBuilders.termQuery("twoClassify", structuredDataTypeEnum.getBiTwoClassify()));
                }
            // 現在只取最大500條(20200415 迪迪確認)
            return Response.ok(getBiStructuredDataList(boolQueryBuilder, 0, 500));
        }
        // 中醫證型
        if(StructuredDataTypeEnum.SYNDROME_TCM.getStructuredType().equals(structuredDataDTO.getStructuredType())){
            return Response.ok(getBiTypeSyndromeWordList(getOrBoolQuery("zx", structuredDataDTO.getStructuredName()), 0, 500));
        }

        // 中醫病名
        if(StructuredDataTypeEnum.CHINESE_DISEASE_NAME.getStructuredType().equals(structuredDataDTO.getStructuredType())){
            return Response.ok(getBiStandardNameLibraryNewList(getOrBoolQuery("bm", structuredDataDTO.getStructuredName()), 0, 500));
        }


        QueryWrapper<StructuredData> queryWrapper = new QueryWrapper<>();
        if (!ObjectUtil.objectIsNull(structuredDataDTO.getStructuredName())) {
            queryWrapper.like("structured_name", structuredDataDTO.getStructuredName());
        }
        queryWrapper.eq("structured_type", structuredDataDTO.getStructuredType());
        queryWrapper.eq("is_deleted", 1);
        List<StructuredData> tongues = structuredDataMapper.selectList(queryWrapper);
        logger.info("舌像數據返回參數:tongues {}", JSON.toJSONString(tongues));
        return Response.ok(tongues);
    }

    /**
     * 獲得分詞或者全詞模糊匹配的boolQuery
     * @param fieldName
     * @param value
     * @return
     */
    private BoolQueryBuilder getOrBoolQuery(String fieldName, String value){
        BoolQueryBuilder boolQueryBuilderTwo = QueryBuilders.boolQuery();
        // 分詞
        boolQueryBuilderTwo.should(new MatchQueryBuilder(fieldName, value));
        // 全詞模糊匹配
        boolQueryBuilderTwo.should(new WildcardQueryBuilder(fieldName, "*" + value + "*"));
        return boolQueryBuilderTwo;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章