黑马程序员技术交流社区

标题: 【郑州校区】Elasticsearch 学习笔记之得分(加权) [打印本页]

作者: 我是楠楠    时间: 2018-10-19 15:09
标题: 【郑州校区】Elasticsearch 学习笔记之得分(加权)
【郑州校区】Elasticsearch 学习笔记之得分(加权)
随着应用程序的增长,提高搜索质量的需求也进一步增大。我们把它叫做搜索体验。我们需要知道什么对用户更重要,关注用户如何使用搜索功能。这导致不同的结论,例如,有些文档比其他的更重要,或特定查询需强调一个字段而弱化其他字段。这就是可以用到加权的地方。
在Query和Field中可以设置加权
创建3条数据,通过加权影响我们的数据结果和得分
1.1. 在Query的查询中定义加权
【创建数据】
1:Article中添加一个属性
[AppleScript] 纯文本查看 复制代码
public class Article {

        private Integer id;
        private String title;
        private String content;
        private String comment;
}
2:重新创建索引和映射,创建文档
[AppleScript] 纯文本查看 复制代码
/**创建 索引*/
        @Test
        public void testCreateIndex_boost() throws Exception{
                // 创建索引
                client.admin().indices().prepareCreate("blog1").get();
                //关闭
                client.close();
        }
       
        /**
         * 创建映射
         */
        @Test
        public void testCreateIndexMapping_boost() throws Exception{
                //构建json的数据格式,创建映射
                XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
                                .startObject()
                                        .startObject("article")
                                                .startObject("properties")
                                                        .startObject("id")
                                                                .field("type","integer").field("store", "yes")
                                                        .endObject()
                                                        .startObject("title")
                                                                .field("type","string").field("store", "yes").field("analyzer","ik")
                                                        .endObject()
                                                        .startObject("content")
                                                                .field("type","string").field("store", "yes").field("analyzer","ik")
                                                        .endObject()
                                                        .startObject("comment")
                                                                .field("type","string").field("store", "yes").field("analyzer","ik")
                                                        .endObject()
                                                .endObject()
                                        .endObject()
                                .endObject();
                PutMappingRequest request = Requests.putMappingRequest("blog1")
                                .type("article")
                                .source(mappingBuilder);
                client.admin().indices().putMapping(request).get();
                //关闭
                client.close();
        }
       
       
        /**创建文档*/
        @Test
        public void createDocument_boost() throws Exception{
               
                Article article = new Article();
//                article.setId(1);
//                article.setTitle("搜索引擎服务器"); // 有搜索
//                article.setContent("基于restful的数据风格"); // 无搜索
//                article.setComment("我们学习Elasticsearch搜索引擎服务器");// 有搜索
               
                article.setId(2);
                article.setTitle("什么是Elasticsearch"); // 无搜索
                article.setContent("Elasticsearch搜索引擎服务器"); // 有搜索
                article.setComment("Elasticsearch封装了lucene");// 无搜索
               
                ObjectMapper objectMapper = new ObjectMapper();
                String source = objectMapper.writeValueAsString(article);
                System.out.println("source:"+source);
               
                IndexResponse indexResponse = client.prepareIndex("blog1", "article", article.getId().toString()).setSource(source).get();
                // 获取响应的信息
                System.out.println("索引名称:"+indexResponse.getIndex());
                System.out.println("文档类型:"+indexResponse.getType());
                System.out.println("ID:"+indexResponse.getId());
                System.out.println("版本:"+indexResponse.getVersion());
                System.out.println("是否创建成功:"+indexResponse.isCreated());
                client.close();
        }
【测试】
[AppleScript] 纯文本查看 复制代码
@Test
        public void testQueryString_boost() throws Exception{
                SearchResponse searchResponse = client.prepareSearch("blog1").setTypes("article")
                                .setQuery(QueryBuilders.queryStringQuery("搜索").field("content^10").field("title^5").field("comment"))
                                .get();
                SearchHits hits = searchResponse.getHits();//获取数据的结果集对象,获取命中次数
                // 显示数据
                this.searchValue(hits);
                //关闭
                client.close();
        }
       
        @Test
        public void testBoolQuery_boost() throws Exception{
                SearchResponse searchResponse = client.prepareSearch("blog1").setTypes("article")
                                .setQuery(QueryBuilders.boolQuery().should(QueryBuilders.termQuery("title", "搜索").boost(5f))
                                                .should(QueryBuilders.termQuery("content", "搜索").boost(10f)))
                                .get();
                SearchHits hits = searchResponse.getHits();//获取数据的结果集对象,获取命中次数
                // 显示数据
                this.searchValue(hits);
                //关闭
                client.close();
        }
【显示结果】
[AppleScript] 纯文本查看 复制代码
// 显示查询的结果数据
        private void searchValue(SearchHits hits) {
                System.out.println("查询的结果数量有"+hits.getTotalHits()+"条");
                System.out.println("结果中最高分:"+hits.getMaxScore());
                // 遍历每条数据
                Iterator<SearchHit> iterator = hits.iterator();
                while(iterator.hasNext()){
                        SearchHit searchHit = iterator.next();
                        System.out.println("所有的数据JSON的数据格式:"+searchHit.getSourceAsString());
                        System.out.println("每条得分:"+searchHit.getScore());
                        // 获取每个字段的数据
                        System.out.println("id:"+searchHit.getSource().get("id"));
                        System.out.println("title:"+searchHit.getSource().get("title"));
                        System.out.println("content:"+searchHit.getSource().get("content"));
                        System.out.println("**********************************************");
                        for(Iterator<SearchHitField> ite = searchHit.iterator();ite.hasNext();){
                                SearchHitField next = ite.next();
                                System.out.println(next.getValues());
                        }
                }
        }
1.2. 在Field字段的映射中定义加权
可以在映射中添加:
等同于:
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2