随着应用程序的增长,提高搜索质量的需求也进一步增大。我们把它叫做搜索体验。我们需要知道什么对用户更重要,关注用户如何使用搜索功能。这导致不同的结论,例如,有些文档比其他的更重要,或特定查询需强调一个字段而弱化其他字段。这就是可以用到加权的地方。

进一步说搜索体验,我们更希望检索出来的数据是最想得到的数据

这个其实就是关于文档的【相关性得分】

进一步细节说:我们查询的所有文档,会在内部做一次相关性的评分score;然后会根据这个score从大到小的排序,依次展示给客户端;

如何计算评分?

Elasticsearch使用的计算评分公式TF-IDF算法的实用计算公式如下:
score(q,d) coord(q,d)queryNorm(q)(tf (tind)idf (t)2 boost(t)norm(t,d))

TF:词频,词在文档中出现的频度是多少? 频度越高,权重 越高

IDF:逆向文档率,词在集合所有文档里出现的频率是多少?频次越高,权重 越低

在我们实际的工作中,我们经常会控制boost来调整score(boost默认值是1)

创建索引和映射:

1):创建索引

@Test
public void createIndex(){
   /**
    * 创建索引
    * */

   client.admin().indices().prepareCreate("blog").get();
}

2):创建映射

/**
* 创建映射
*/
@Test
public void testCreateIndexMapping_boost() throws Exception{
   /**
    * 格式:
    * "mappings" : {
    *     "document" : {
    *         "dynamic" : "false",
    *         "properties" :{
    *             "id" : { "type" : "string" },
    *             "content" : { "type" : "string" },
    *             "comment" : {"type" : "string"},
    *             "author" : { "type" : "string" }
    *         }
    *     }
    * }
    */
   //构建json的数据格式,创建映射
   XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
          .startObject()
          .startObject("document")
          .startObject("properties")
              .startObject("id").field("type","integer").field("store", "yes")
          .endObject()
          .startObject("title").field("type","string").field("store", "yes").field("analyzer" , "ik_max_word")
          .endObject()
          .startObject("content").field("type","string").field("store", "yes").field("analyzer" , "ik_max_word")
          .endObject()
          .startObject("comment").field("type","string").field("store", "yes").field("analyzer" , "ik_max_word")
          .endObject()
          .endObject()
          .endObject()
          .endObject();
   PutMappingRequest request = Requests.putMappingRequest("blog")
          .type("document")
          .source(mappingBuilder);
   client.admin().indices().putMapping(request).get();
}

3):创建Document实体类

package com.elasticsearch.bean;

/**
* Created by angel;
*/
public class Document {
   private Integer id;
   private String title;
   private String content;
   private String comment;

   public Integer getId() {
       return id;
  }

   public String getComment() {
       return comment;
  }

   public String getContent() {
       return content;
  }

   public String getTitle() {
       return title;
  }

   public void setComment(String comment) {
       this.comment = comment;
  }

   public void setContent(String content) {
       this.content = content;
  }

   public void setId(Integer id) {
       this.id = id;
  }

   public void setTitle(String title) {
       this.title = title;
  }
}

4):重新创建索引和映射,创建文档

   /**
    * 创建文档
    * */
   @Test
   public void createDocument() throws JsonProcessingException {
       Document document = new Document();


//   document.setId(1);
//   document.setTitle("搜索引擎服务器");
//   document.setContent("基于restful的数据风格");
//   document.setComment("我们学习Elasticsearch搜索引擎服务器");
//
//       document.setId(2);
//       document.setTitle("什么是Elasticsearch");
//       document.setContent("Elasticsearch搜索引擎服务器");
//       document.setComment("Elasticsearch封装了lucene");
//
       document.setId(3);
       document.setTitle("Elasticsearch的用途");
       document.setContent("Elasticsearch可以用来进行海量数据的检索");
       document.setComment("Elasticsearch真NB");

       ObjectMapper objectMapper = new ObjectMapper();
       String source = objectMapper.writeValueAsString(document);
       System.out.println("source:"+source);

       IndexResponse indexResponse = client.prepareIndex("blog", "document", document.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.status());
       client.close();
  }

5):测试:

//TODO 如何让id2 在 id1前面
   @Test
   public void BoolQuery_boost(){
       SearchResponse searchResponse = client.prepareSearch("blog").setTypes("document")
              .setQuery(QueryBuilders.boolQuery()
                      .should(QueryBuilders.termQuery("title" ,  "搜索"))
                      .should(QueryBuilders.termQuery("content" ,  "搜索"))
                      .should(QueryBuilders.termQuery("comment" ,  "搜索"))

              ).get();
       SearchHits hits = searchResponse.getHits();//获取数据的结果集对象,获取命中次数
       // 显示数据
       printSearch(hits);

  }

   public void printSearch(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());
          }
      }
  }

es之得分(加权)的更多相关文章

  1. Elasticsearch--更好的搜索_加权得分,脚本,同义词

    目录 Apache Lucene评分 Elasticsearch的脚本功能 脚本执行过程中可以使用的对象 使用自定义的脚本库 搜索不同语言的内容 使用加权影响得分 加权 function_score查 ...

  2. Paper | Blind Quality Assessment Based on Pseudo-Reference Image

    目录 1. 技术细节 1.1 失真识别 1.2 得到对应的PRI并评估质量 块效应 模糊和噪声 1.3 扩展为通用的质量评价指标--BPRI 归一化3种质量评分 判断失真类型 加权求和 2. 总结 这 ...

  3. 因果推理综述——《A Survey on Causal Inference》一文的总结和梳理

    因果推理 本文档是对<A Survey on Causal Inference>一文的总结和梳理. 论文地址 简介 关联与因果 先有的鸡,还是先有的蛋?这里研究的是因果关系,因果关系与普通 ...

  4. C#如何使用ES

    Elasticsearch简介 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定.可靠.快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的. Elas ...

  5. C# 如何使用 Elasticsearch (ES)

    Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好 ...

  6. C#使用ES

    C#如何使用ES Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为 ...

  7. ES相关信息

    漫画版原理介绍 搜索引擎的核心:倒排索引 elasticsearch 基于Lucene的,封装成一个restful的api,通过api就可进行操作(Lucene是一个apache开放源代码的全文检索引 ...

  8. #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

    郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...

  9. ES搜索引擎-简单入门

    基本概念: 索引Index es吧数据放到一个或者多个索引中,如果用关系型数据库模型对比,索引的地位与数据库实例(db)相当.索引存放和读取的基本单元是文档(document).es内部使用的是apa ...

随机推荐

  1. linux最强编辑神器vim常用命令大全:编辑、插入、删除、替换、保存...

    我说vim是编辑器之神大家没有意见吧 下面分享一些vim常用命令,大家可以收藏一下 进入vim:  vim配置: vim中光标移动: vim中屏幕滚动: vim中插入文本类: 文本替换: 格式 : 范 ...

  2. P2672跳石头

    这是2015noip的一道二分答案的题目,看了题解才会,, 题目给出石头的位置并且让你踩着石头往前跳,最多删掉m个石头还可以顺利通过,求解最短跳跃距离的最大值. 那么二分什么呢:mid为跳跃的长度.那 ...

  3. python常量 (最全常量解析)

    常量 一.常量 变量是变化的量,常量则是不变的量.python中没有使用语法强制定义常量,也就是说,python中定义常量本质上就是变量.如果非要定义常量,变量名必须全大写. AGE_OF_NICK ...

  4. Structs2下的MyFirstTest

    1.这是<Struts2-权威指南>第二章的例子 2.博文主要说明在eclipse下如何创建一个struts2项目 3.实现功能:在login.jsp输入用户名和密码,若用户名为scott ...

  5. DOM属性和事件

    1-22 DOM属性设置与获取   1.获取属性: getAttribute("attribute"): var p = document.getElementById(" ...

  6. 计算视图相对坐标时convertPoint:toView: ,UIApplication sharedApplication - keyWindow is nil?

    UIWindow *window = [UIApplication sharedApplication].keyWindow; window 为nil的原因:在指定rootViewController ...

  7. MySQL使用explain时各字段解释

    1.id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: (1)id相同,执行顺序由上至下 id相同,执行顺序由上至下 此例中 先执行where 后的 ...

  8. CodeBlocks17.12+汉化包下载及用法

    本文已迁移至:https://blog.csdn.net/COCO56/article/details/95228780

  9. MIT-线性代数公开课

    本博客是学习MIT-线性代数笔记,Gilbert Strang大神讲的通俗易懂,感兴趣的可以观看视频 其中习题集请点击 01)方程组的几何解释 02)矩阵消元 03)乘法和逆矩阵 04)A的LU分解 ...

  10. FPGA 物理时序不合理的体现(体现方式:数字钟的行扫描和列扫描)

    本人在这只讨论建模好的模块来比较解释现象,如有不周到请大家指正. 软件功能仿真和在硬件上的区别:可以从这个数码管的行扫描和列扫描实例来体会一下,物理时序的影响和改进方法. 数码管的行扫描.列扫描要求同 ...