zoukankan      html  css  js  c++  java
  • ElasticSearch多个字段分词查询高亮显示

    ElasticSearch关键字查询,将关键字分词后查询,多个字段,查询出来字段高亮显示。
    查询方法如下:

    public List<NewsInfo> searcher2(String key, String indexId, String type) {
            List<NewsInfo> newsInfos= new ArrayList<NewsInfo>();
            try {
                // 创建查询索引,参数productindex表示要查询的索引库为productindex
                SearchRequestBuilder searchRequestBuilder = client
                        .prepareSearch(indexId);
    
                // 设置查询索引类型,setTypes("productType1", "productType2","productType3");
                // 用来设定在多个类型中搜索
                searchRequestBuilder.setTypes(type);
                // 设置查询类型 1.SearchType.DFS_QUERY_THEN_FETCH = 精确查询 2.SearchType.SCAN
                // = 扫描查询,无序
                searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
                // 设置查询关键词
    //          searchRequestBuilder
    //                  .setQuery(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("title", key))
    //                          .should(QueryBuilders.termQuery("content", key)));
                QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
                queryBuilder.analyzer("ik_smart");
                queryBuilder.field("title").field("content");
                searchRequestBuilder.setQuery(queryBuilder);
                // 分页应用
                 searchRequestBuilder.setFrom(1).setSize(3000);
    
                // 设置是否按查询匹配度排序
                searchRequestBuilder.setExplain(true);
                // 按照字段排序
                searchRequestBuilder.addSort("publish_time", SortOrder.DESC);
                // 设置高亮显示
                searchRequestBuilder.addHighlightedField("title");
                searchRequestBuilder.addHighlightedField("content");
                searchRequestBuilder
                        .setHighlighterPreTags("<span style="color:red">");
                searchRequestBuilder.setHighlighterPostTags("</span>");
    //          searchRequestBuilder.setHighlighterPreTags("<em>");
    //          searchRequestBuilder.setHighlighterPostTags("<em>");
                // 执行搜索,返回搜索响应信息
                SearchResponse response = searchRequestBuilder.execute()
                        .actionGet();
    
                // 获取搜索的文档结果
                SearchHits searchHits = response.getHits();
                SearchHit[] hits = searchHits.getHits();
                // ObjectMapper mapper = new ObjectMapper();
                for (int i = 0; i < hits.length; i++) {
                    SearchHit hit = hits[i];
                    // 将文档中的每一个对象转换json串值
                    String json = hit.getSourceAsString();
                    // 将json串值转换成对应的实体对象
                    NewsInfo newsInfo = JsonUtils
                            .readToObject(json, NewsInfo.class);
                    // 获取对应的高亮域
                    Map<String, HighlightField> result = hit.highlightFields();
                    // 从设定的高亮域中取得指定域
                    HighlightField titleField = result.get("title");
                    if (titleField !=null) {
                        // 取得定义的高亮标签
                        Text[] titleTexts = titleField.fragments();
                        // 为title串值增加自定义的高亮标签
                        String title = "";
                        for (Text text : titleTexts) {
                            title += text;
                        }
                        newsInfo.setTitle(title);
                    }
                    // 从设定的高亮域中取得指定域
                    HighlightField contentField = result.get("content");
                    if (contentField !=null) {
                        // 取得定义的高亮标签
                        Text[] contentTexts = contentField.fragments();
                        // 为title串值增加自定义的高亮标签
                        String content = "";
                        for (Text text : contentTexts) {
                            content += text;
                        }
                        // 将追加了高亮标签的串值重新填充到对应的对象
                        newsInfo.setContent(content);
                    }
                    newsInfos.add(newsInfo);
    //              System.out.println(newsInfo.toString());
                    // 打印高亮标签追加完成后的实体对象
                }
                // 防止出现:远程主机强迫关闭了一个现有的连接
    //          Thread.sleep(10000);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            return newsInfos;
        }

    多字段查询方法:

    QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(key);
                queryBuilder.analyzer("ik_smart");
                queryBuilder.field("title").field("content");
                searchRequestBuilder.setQuery(queryBuilder);
  • 相关阅读:
    Jmeter分离登录事务的另一种方式
    数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索
    使用jmeter往指定文件中插入一定数量的数据
    JMeter 各组件介绍以及用法
    JVM(2) Java内存溢出异常
    JVM(1) Java内存区域
    OptimalSolution(1)--递归和动态规划(4)其他问题
    MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、
    OptimalSolution(1)--递归和动态规划(3)数组和字符串问题
    OptimalSolution(1)--递归和动态规划(2)矩阵的最小路径和与换钱的最少货币数问题
  • 原文地址:https://www.cnblogs.com/luweiwei/p/5968513.html
Copyright © 2011-2022 走看看