1.

  BoolQueryBuilder qb=QueryBuilders. boolQuery();
qb.should(QueryBuilders.matchQuery("keyWord","经济"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withFields("userName","keyWord","userId")
.withHighlightFields(new HighlightBuilder.Field("keyWord").fragmentSize())
.build();
AggregatedPage<SearchHistory> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SearchHistory.class, new SearchResultMapper() {
@Override
public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
List<SearchHistory> chunk = new ArrayList<SearchHistory>();
SearchHits hits = response.getHits();
for (SearchHit searchHit : response.getHits()) {
if (response.getHits().getHits().length <= ) {
return null;
}
SearchHistory user = new SearchHistory();
user.setUserId((Integer)searchHit.getFields().get("userId").getValue());//这么获取
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();//高亮字段为空
chunk.add(user);
}
if (chunk.size() > ) {
return new AggregatedPageImpl<T>((List<T>) chunk);
}
return null;
}
});
return sampleEntities;
 .withQuery(termQuery("keyWord", "安徽"))  //单个可以使用
.withQuery(termQuery("userName", "小经济")) //两个一块写后面会覆盖前面的也就是以“小经济”为高亮
.withFields("userName","keyWord","userId")
.withHighlightFields(new HighlightBuilder.Field("keyWord").fragmentSize(),new HighlightBuilder.Field("userName").fragmentSize())//.preTags("<am>").postTags("</am>").fragmentSize(15)) 1
.withQuery(QueryBuilders.queryStringQuery("安徽")) //这样组合可以查出来,但是没有高亮
.withFields("userName","keyWord","userId") //去掉这行,在source中,没有高亮
.withHighlightFields(new HighlightBuilder.Field("keyWord").fragmentSize(),new HighlightBuilder.Field("userName").fragmentSize())//.preTags("<am>").postTags("</am>").fragmentSize(15)) 1
.withFilter(boolQuery().should(termQuery("keyWord", "经济")).should(termQuery("keyWord", "安徽"))) //这样组合可以查出来,但是没有高亮
String[]  includes = new String[]{"userName","keyWord","userId"};
.withHighlightFields(new HighlightBuilder.Field("keyWord").fragmentSize(),new HighlightBuilder.Field("userName").fragmentSize())
.withQuery(boolQuery().should(termQuery("keyWord", "安徽")).should(termQuery("userName","小经济")))
.withSourceFilter(new FetchSourceFilter(includes,new String[]{})) //这个是可以
结果 : {keyWord='<em>安徽</em>商报报道,<em>安徽</em>宣城市泾县一名', userId=1005, userName='<em>小经济</em>'}
 String keyWord = searchHit.getHighlightFields().get("keyWord").fragments()[0].toString();
String userName = searchHit.getHighlightFields().get("userName").fragments()[0].toString();
user.setUserId((Integer) searchHit.getSource().get("userId"));

2. 测试ik

/**
* 测试ik
* @throws IOException
*/
public void test() throws IOException {
AnalyzeRequestBuilder ikRequest = new AnalyzeRequestBuilder(elasticsearchTemplate.getClient(),
AnalyzeAction.INSTANCE,"test","一个大的安全帽");
ikRequest.setTokenizer("ik");
List<AnalyzeResponse.AnalyzeToken> ikTokenList = ikRequest.execute().actionGet().getTokens(); // 循环赋值
List<String> searchTermList = new ArrayList<>();
ikTokenList.forEach(ikToken -> { searchTermList.add(ikToken.getTerm()); }); System.out.println(JSON.json(searchTermList));
}

3.

termQuery 和 matchQuery 和 multiMatchQuery 和 matchPhraseQuery

4. store属性

5. 将时间加入权重中

(1)最终找到的方案

     Map<String, Object> params = new HashMap<>();
params.put("pubTimeStamp", 1521632807000L);
String inlineScript = "return (1/(pubTimeStamp-doc['pubTimeStamp'].value.toDouble()+1))/2"; //时间加入权重的公式
Script script = new Script(inlineScript, ScriptService.ScriptType.INLINE, "groovy", params); //设置脚本
QueryBuilder queryBuilder = boolQuery().must(matchQuery("title","中国"));//普通的查询
ScoreFunctionBuilder scoreFunctionBuilder = ScoreFunctionBuilders.scriptFunction(script);//将脚本加入函数中
FunctionScoreQueryBuilder query = QueryBuilders.functionScoreQuery(queryBuilder,scoreFunctionBuilder);//加入普通查询和脚本
     SearchQuery searchQuery = new NativeSearchQueryBuilder()
//搜索的type(相当于table)
.withTypes(types)
//高亮字段定义
          .withHighlightFields(new HighlightBuilder.Field("title").preTags("<font color=\"#ff55ae\">").postTags("</font>"))
//查询条件
.withQuery(query) //加入查询条件(包含普通和脚本)
//返回字段includes 和不包含的字段 excludes
.withSourceFilter(new FetchSourceFilter(queryFields,new String[]{})) //这个是可以
//分页
.withPageable(pageable)
.build();

上面函数对应的restful

{
"function_score" : {
"query" : {
"bool" : {
"must" : {
"match" : {
"title" : {
"query" : "中国",
"type" : "boolean"
}
}
}
}
},
"functions" : [ {
"script_score" : {
"script" : {
"inline" : "return (1/(pubTimeStamp-doc['pubTimeStamp'].value.toDouble()+1))/2",
"lang" : "groovy",
"params" : {
"pubTimeStamp" :
}
}
}
} ]
}
}

正确的应该是这种样式的

{
"query": {
"function_score": {
"query": {
"match": {
"title": "天安门"
}
},
"script_score": {
"script": "return (1/(pubTimeStamp-doc['pubTimeStamp'].value.toDouble()+1))/2",
"lang": "groovy",
"params": {
"pubTimeStamp":
}
}
}
}
}

(2)走过的错路

 Map<String, Object> params = new HashMap<>();
params.put("pubTimeStamp", 1521632807000L);
String inlineScript = "return (1/(pubTimeStamp-doc['pubTimeStamp'].value.toDouble()+1))/2";
Script script = new Script(inlineScript, ScriptService.ScriptType.INLINE, "groovy", params);
QueryBuilder queryBuilder = boolQuery().must(matchQuery("title","中国"));
ScoreFunctionBuilder scoreFunctionBuilder = ScoreFunctionBuilders.scriptFunction(script);
      SearchQuery searchQuery = new NativeSearchQueryBuilder()
//搜索的type(相当于table)
.withTypes(types)
//高亮字段定义
         .withHighlightFields(new HighlightBuilder.Field("title").preTags("<font color=\"#ff55ae\">").postTags("</font>"))
//查询条件
.withQuery(functionScoreQuery().add(queryBuilder,scoreFunctionBuilder))//放入普通的查询和脚本查询
//返回字段includes 和不包含的字段 excludes
.withSourceFilter(new FetchSourceFilter(queryFields,new String[]{})) //这个是可以
//分页
.withPageable(pageable)
.build();

这样出来的restful

{
"function_score" : {
"functions" : [ { //从这里可以看出是不正确的,function不应该包含filter(对照上面正确的可以看出),查出来的结果就是将不包含"中国"的数据也差出来了,还有就是分数总是为1.0
"filter" : {
"bool" : {
"must" : {
"match" : {
"title" : {
"query" : "中国",
"type" : "boolean"
}
}
}
}
},
"script_score" : {
"script" : {
"inline" : "return (1/(pubTimeStamp-doc['pubTimeStamp'].value.toDouble()+1))/2",
"lang" : "groovy",
"params" : {
"pubTimeStamp" :
}
}
}
} ]
}
}

6. 分数公式

(1)totalScore = _socre * doc['id'].value  ====》    总分数 = 原始分数 *  二次评分

"script_score": {
"script": "doc['id'].value",
"lang": "groovy"
}

(2)跟上面一样

"script_score": {
"script": "_score+doc['id'].value",
"lang": "groovy"
}

elasticSearch Java Spring Data Api的更多相关文章

  1. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI

    目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...

  2. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  3. Elasticsearch Java Rest Client API 整理总结 (一)——Document API

    目录 引言 概述 High REST Client 起步 兼容性 Java Doc 地址 Maven 配置 依赖 初始化 文档 API Index API GET API Exists API Del ...

  4. mongodb java spring data

    关于如何集成spring-data-mongodb到项目中,已经有很多人介绍了,这里只给出几个链接. GETTING STARTED Accessing Data with MongoDB: http ...

  5. Elasticsearch Java Rest Client API 整理总结 (一)

    http://www.likecs.com/default/index/show?id=39549

  6. Spring Data ElasticSearch的使用

    1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...

  7. 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分

    Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...

  8. 3.4_springboot2.x整合spring Data Elasticsearch

    Spring Data Elasticsearch 是spring data对elasticsearch进行的封装. 这里有两种方式操作elasticsearch: 1.使用Elasticsearch ...

  9. Elasticsearch基本用法(2)--Spring Data Elasticsearch

    Spring Data Elasticsearch是Spring Data项目下的一个子模块. 查看 Spring Data的官网:http://projects.spring.io/spring-d ...

随机推荐

  1. JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??

    <script type="text/javascript">     var x = 4.23323;//测试的数字     var y = String(x).in ...

  2. 七、dbms_rowid(用于在PL/SQL程序和SQL语句中取得行标识符)

    1.概述 作用:用于在PL/SQL程序和SQL语句中取得行标识符(rowid)的信息并建立ROWID,通过该包可以取得行所在的文件号,行所在文件的数据块号,行所在数据块的行号,以及数据库对象号等消息. ...

  3. 极简MarkDown教程(常用样式)

    推荐编辑软件,NotePad++ & MarkDownViewer++(插件),以下内容为MarkDown格式,可自行放到编辑软件中查看,或在线查看 #### . 标题 > 用#+空格开 ...

  4. TI IPNC Web网页之进阶修改

    GoDB内嵌HTML 原始的页面里面已经有一个内嵌HTML的例子了,那就是维护支持页面.下图是稍微修改后的页面...请自行脑补. 这里使用的是上一节所说的gdo containter的方法. 打开ma ...

  5. 报错:java.lang.IllegalArgumentException: object is not an instance of declaring class

    反射的报错信息如下: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.r ...

  6. c# http操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  7. 锐捷S2126交换机端口限速

    一.对于S21的进入(上行)的数据的限速,可以用Qos做到. ip access-list extended acl_1                配置ACLpermit ip 172.16.41 ...

  8. 在父容器div中图片下方有一条空隙问题

    问题:<div><img src="mm1.jpg"></div> 然后,表现就是一张图片呈现,类似下面这样: 恩,看上去很正常,一切都是理所当 ...

  9. JSP学习(二)JSP指令

    JSP指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. JSP指令的基本语法格式:<%@ 指令 属性名= ...

  10. bzoj 4811 由乃的OJ

    bzoj 4811 由乃的OJ 考虑树链剖分. 树剖后用一颗线段树维护一段连续区间,类似于一个函数,各位上进入 \(0/1\) ,输出的数字分别是什么.注意到最多只有 \(64\) 位,可以用一个 \ ...