• springboot+elasticsearch + rabbitMQ实现全文检索(使用transportClient 实现CRUD)


    package com.mytian.service.impl;
    
    import com.alibaba.fastjson.JSONArray;
    import com.mytian.entity.BlogImgUrl;
    import com.mytian.entity.BlogInfo;
    import com.mytian.entity.SearchTermBean;
    import com.mytian.service.PublishBlogService;
    import com.mytian.service.SearchService;
    import com.mytian.util.MytBeanUtils;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.action.update.UpdateRequest;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.unit.Fuzziness;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.BoolQueryBuilder;
    import org.elasticsearch.index.query.MultiMatchQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.rest.RestStatus;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.SearchHits;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import static jdk.nashorn.internal.objects.Global.println;
    import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
    
    /**
     * 搜索服务
     *
     * @author m.feng
     * @create 2018-12-14-17:50
     */
    @RestController
    public class SearchServiceImpl implements SearchService {
    
        public static Logger LOGGER = LoggerFactory.getLogger(SearchServiceImpl.class);
    
        @Autowired
        private TransportClient transportClient;
    
        @Autowired
        private PublishBlogService publishBlogService;
    
        @Override
        public boolean  saveBlogTitle(String json) throws Exception {
            IndexResponse response = transportClient.prepareIndex("bloginfo", "blog")
                    .setSource(json, XContentType.JSON)
                    .get();
            // 索引名字
            String _index = response.getIndex();
            // 类型
            String _type = response.getType();
            // 文档ID
            String _id = response.getId();
            // 文档版本号
            long _version = response.getVersion();
            RestStatus status = response.status();
            System.out.println(_index+"_"+_type+"_"+_id);
            return true;
        }
    
        @Override
        public boolean addBlogInfo(@RequestBody BlogInfo blogInfo)throws IOException {
            List<BlogImgUrl> blogImgUrls = blogInfo.getBlogImgUrls();
            String imgStr = JSONArray.toJSONString(blogImgUrls);
            IndexResponse response = transportClient.prepareIndex("bloginfo", "blog",blogInfo.getBlogId().toString())
                    .setSource(jsonBuilder()
                            .startObject()
                            .field("blogId", blogInfo.getBlogId())
                            .field("uid", blogInfo.getUid())
                            .field("title", blogInfo.getTitle())
                            .field("specialTopicId", blogInfo.getSpecialTopicId())
                            .field("updateTime", blogInfo.getUpdateTime())
                            .field("insertTime", blogInfo.getInsertTime())
                            .field("blogGrade", blogInfo.getBlogGrade())
                            .field("shareNum", blogInfo.getShareNum())
                            .field("agreeNum", blogInfo.getAgreeNum())
                            .field("commentNum", blogInfo.getCommentNum())
                            .field("status", blogInfo.getStatus())
                            .field("isSee", blogInfo.getIsSee())
                            .field("isReal", blogInfo.getIsReal())
                            .field("headThumb", blogInfo.getHeadThumb())
                            .field("alias", blogInfo.getAlias())
                            .field("blogContent", blogInfo.getBlogContent())
                            .field("blogImgUrls", imgStr)
                            .endObject()
                    )
                    .get();
            return true;
        }
    
    
    //    @Override
    //    public String mymatchQuery() throws Exception{
    //        QueryBuilder qb = QueryBuilders.matchQuery(
    //                "title",//字段
    //                "牧风"//搜索的文本
    //        );
    //        SearchResponse response = transportClient.prepareSearch("bloginfo").setQuery(qb).get();
    //        //解析response
    //        System.out.println(response);
    //        SearchHits hits = response.getHits();
    //        List<BlogInfo> list = new ArrayList();
    //        for (SearchHit searchHit : hits) {
    //            Map source = searchHit.getSource();
    //            BlogInfo blogInfo = new BlogInfo();
    //            MytBeanUtils. transMap2Bean(source,blogInfo);
    //            list.add(blogInfo);
    //        }
    //        String string = JSONArray.toJSONString(list);
    //        System.out.println(string);
    //        return string;
    //    }
    
    
        @Override
        public String mymatchQuery(@RequestBody SearchTermBean searchTermBean,Integer uid) throws Exception{
            String indexSea = searchTermBean.getIndexSea();
            Integer page = searchTermBean.getPage();
            String search = searchTermBean.getSearch();
            Integer size = searchTermBean.getSize();
            String typeSea = searchTermBean.getTypeSea();
    
            LOGGER.info("-[全文检索条件]--[indexSea]-" +
                    "-"+indexSea+"--[page]--"+page+"--[search]-" +
                    "-"+search+"--[size]--"+size+"--[typeSea]--"+typeSea+"-----");
    
            BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(search,"title", "content");
            mustQuery.must(QueryBuilders.matchAllQuery()); // 添加第1条must的条件 此处为匹配所有文档
            mustQuery.must(QueryBuilders.matchPhraseQuery("status", 1));
            mustQuery.must(QueryBuilders.matchPhraseQuery("isSee", 1));
            mustQuery.must(QueryBuilders.matchPhraseQuery("isReal", 1));
            mustQuery.must(multiMatchQueryBuilder);
            SearchResponse searchResponse =  transportClient.prepareSearch()
                    .setIndices(indexSea)
                    .setTypes(typeSea)
                    .setFrom(page).setSize(size)
                    .setQuery(mustQuery)
                    .execute()
                    .actionGet();
    
            List<BlogInfo> list = new ArrayList();
            SearchHits hits = searchResponse.getHits();
            for (SearchHit searchHit : hits) {
                Map source = searchHit.getSource();
                BlogInfo blogInfo = new BlogInfo();
                MytBeanUtils. transMap2Bean(source,blogInfo);
                list.add(blogInfo);
            }
            for (BlogInfo blogInfo : list){
                blogInfo.setIsAgree(0);
                if (uid != null){
                    Integer integer = publishBlogService.selectCountByUidAndBlogID(uid,blogInfo.getBlogId());
                    if (integer == 1){
                        blogInfo.setIsAgree(1);
                    }
                }
            }
            String string = JSONArray.toJSONString(list);
            LOGGER.info("--------查询结果------"+string+"---------------");
            return string;
        }
    
        @Override
        public void updateESBlog(@RequestBody BlogInfo blogInfo) throws Exception {
            UpdateRequest updateRequest = new UpdateRequest("bloginfo", "blog", blogInfo.getBlogId().toString());
            updateRequest.doc(blogInfo);
            transportClient.update(updateRequest);
        }
    }

    因为 我的bean 里面套了一个list 在将返回结果编程对象的时候失败了

    package com.mytian.util;
    
    import com.alibaba.fastjson.JSONArray;
    import com.mytian.entity.BlogInfo;
    
    import java.beans.BeanInfo;
    import java.beans.IntrospectionException;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 麦田bean工具
     *
     * @author m.feng
     * @create 2018-12-19-14:42
     */
    public class MytBeanUtils {
    
        /**
         * 讲map转换 blogInfo 对象
         * @param map
         * @param obj
         * @throws IntrospectionException
         * @throws InvocationTargetException
         * @throws IllegalAccessException
         */
        public static void transMap2Bean(Map<String, Object> map, BlogInfo obj) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
    
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();
                if (key.equals("blogImgUrls")){
                    String value =(String) map.get(key);
    //                String string = JSONObject.toJSONString(value);
                    List list = JSONArray.parseObject(value, List.class);
                    obj.setBlogImgUrls(list);
                    continue;
    //                ObjectMapper mapper = new ObjectMapper();
    //                List<Bean> beanList = mapper.readValue(string, new TypeReference<List<Bean>>() {});
                }
                if (map.containsKey(key)) {
                    Object value = map.get(key);
                    // 得到property对应的setter方法
                    Method setter = property.getWriteMethod();
                    setter.invoke(obj, value);
                }
            }
        }
    }

    我自己单独处理了一下 解决com.fasterxml.jackson.databind.JsonMappingException: No suitable 以 Jackson

    https://blog.csdn.net/yinjayhui123/article/details/45196843

    引用博文:https://www.cnblogs.com/ghj1976/p/5293250.html

    http://www.cnblogs.com/fclbky/p/7124469.html

    https://www.cnblogs.com/wpcnblog/p/7903716.html

    https://blog.csdn.net/hu582205/article/details/84861619

    https://blog.csdn.net/dm_vincent/article/details/41800351

    https://blog.csdn.net/lom9357bye/article/details/52852533

    https://www.cnblogs.com/sbj-dawn/p/8891419.html

    https://blog.csdn.net/g1969119894/article/details/80169055

    https://blog.csdn.net/alan_liuyue/article/details/78588901 多条件组合查询

    https://blog.csdn.net/qq_36330643/article/details/79071737 Multi Match Query实现查询

    https://blog.csdn.net/u011781521/article/details/77848489 这个对我帮助很大

    分页

    https://blog.csdn.net/u013514928/article/details/78749419

  • 相关阅读:
    视频直播思路
    Swift 算法实战之路:栈和队列
    多线程(RunLoop)
    Charle抓包与wireshark使用
    CoreData归纳使用
    支付宝接入心得(流程)
    TableView的性能优化
    app启动页问题
    公司的开发者账号申请
    java关于时间的笔记
  • 原文地址:https://www.cnblogs.com/mfser/p/10150088.html
Copyright © 2020-2023  润新知