es之得分(加权)
随着应用程序的增长,提高搜索质量的需求也进一步增大。我们把它叫做搜索体验。我们需要知道什么对用户更重要,关注用户如何使用搜索功能。这导致不同的结论,例如,有些文档比其他的更重要,或特定查询需强调一个字段而弱化其他字段。这就是可以用到加权的地方。
进一步说搜索体验,我们更希望检索出来的数据是最想得到的数据;
这个其实就是关于文档的【相关性得分】
进一步细节说:我们查询的所有文档,会在内部做一次相关性的评分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之得分(加权)的更多相关文章
- Elasticsearch--更好的搜索_加权得分,脚本,同义词
目录 Apache Lucene评分 Elasticsearch的脚本功能 脚本执行过程中可以使用的对象 使用自定义的脚本库 搜索不同语言的内容 使用加权影响得分 加权 function_score查 ...
- Paper | Blind Quality Assessment Based on Pseudo-Reference Image
目录 1. 技术细节 1.1 失真识别 1.2 得到对应的PRI并评估质量 块效应 模糊和噪声 1.3 扩展为通用的质量评价指标--BPRI 归一化3种质量评分 判断失真类型 加权求和 2. 总结 这 ...
- 因果推理综述——《A Survey on Causal Inference》一文的总结和梳理
因果推理 本文档是对<A Survey on Causal Inference>一文的总结和梳理. 论文地址 简介 关联与因果 先有的鸡,还是先有的蛋?这里研究的是因果关系,因果关系与普通 ...
- C#如何使用ES
Elasticsearch简介 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定.可靠.快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的. Elas ...
- C# 如何使用 Elasticsearch (ES)
Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好 ...
- C#使用ES
C#如何使用ES Elasticsearch简介 Elasticsearch (ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为 ...
- ES相关信息
漫画版原理介绍 搜索引擎的核心:倒排索引 elasticsearch 基于Lucene的,封装成一个restful的api,通过api就可进行操作(Lucene是一个apache开放源代码的全文检索引 ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- ES搜索引擎-简单入门
基本概念: 索引Index es吧数据放到一个或者多个索引中,如果用关系型数据库模型对比,索引的地位与数据库实例(db)相当.索引存放和读取的基本单元是文档(document).es内部使用的是apa ...
随机推荐
- kafka使用问题解决
java.lang.UnsupportedClassVersionError:org/apach/kafka/comon/utils/Utils:Unsupport major.minor versi ...
- LINUX之启动流程
(上图片转自一位高手所做) 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关 ...
- 编写的Java第一个程序
没什么好介绍的,嘻嘻 package head; public class ee { public static void main(String[] args) { System.out.print ...
- es6中let实例应用之一
有如下情景 html部分: <button class="btn">按钮1</button> <button class="btn" ...
- iOS手势操作,拖动,轻击,捏合,旋转,长按,自定义(http://www.cnblogs.com/huangjianwu/p/4675648.html)
1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureReco ...
- 流畅的Python (Fluent Python) —— 前言
本书重点: 这本书并不是一本完备的 Python 使用手册,而是会强调 Python 作为编程语言独有的特性,这些特性或者是只有 Python 才具备的,或者是在其他大众语言里很少见的. Python ...
- lilybbs-faq - linux入门以及百合 Linux 版精华区导读
QUESTIONS 问题与解答 不需要任何命令的简单介绍 历史 (APUE 提到了1990年之前的unix历史,还有各种标准 ANSI ISO IEEE posix xpg3.... 但是linux ...
- TensorFlow机器学习实战指南之第二章2
TensorFlow实现反向传播 本节先举个简单的回归算法的例子.这里先举一个简单的例子,从均值1,标准差为0.1的正态分布中随机抽样100个数,然后乘以变量A,损失函数L2正则函数,也就是实现函数X ...
- jenkins上job误删除怎么恢复
1.点击jobConfigHistory 2.点击Show deleted jobs only 3.找到被删除的 记录,点击Restore
- git-bash.exe参数
baidu搜了很多, 没有结果.估计大家都没有这个场景.google了一下, 几篇非常不错的结果: https://superuser.com/questions/1104567/how-can-i- ...