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. 【51nod-1042】数字0-9的数量

    给出一段区间a-b,统计这个区间内0-9出现的次数.   比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ...

  2. 重温ASP.NET WebAPI(一)初阶

    重温ASP.NET WebAPI(一)初阶   前言 本文为个人对WebApi的回顾无参考价值.主要简单介绍WEB api和webapi项目的基本结构,并创建简单地webaapi项目实现CRUD操作. ...

  3. APUE学习笔记——6 系统数据文件与信息

    1.用户口令:/etc/passwd文件 该文件中包含下列结构体信息.其中,当下主修熊passwd不再这里显示,是使用了一个占位符. struct passwd { char * pw_name; / ...

  4. React-Native基础_2.样式Style

    2.样式Style 基本使用 方式1 直接在View 上面写style 内容 <View style={{ backgroundColor: '#07811d', flex: 1 }}> ...

  5. TeamTalk源码分析(十一) —— pc客户端源码分析

           --写在前面的话  在要不要写这篇文章的纠结中挣扎了好久,就我个人而已,我接触windows编程,已经六七个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究windows程序上 ...

  6. linux远程win7教程

    http://jingyan.baidu.com/article/c275f6bacd2227e33c756754.html 1 在ubuntu下搜索Remmina(超级方便,应该也可以控制linux ...

  7. vue样式穿透

    在一次这样的需求中,需要实现滑倒底部时自动请求数据,需要动态创建节点然后追加到某元素中,这期间遇到的问题就是在动态创建节点后,类名也已经加上了 ,但是样式就是没有生效,最后发现原因的产生竟然是< ...

  8. python 生成器推导式与列表推导式的区别

    生成器表达式现用现生成,列表推导式一次性生成静态数据 L = [2, 3, 5, 7] L2 = (x**2+1 for x in L) it = iter(L2) print(next(it)) L ...

  9. 【test】

    {"type":[    {"name":"专题分类","num":1,"value":[      ...

  10. Hadoop_10_11虚拟机02_虚拟机桥接方式联网【自己的亲测笔记】

    [桥接方式] 说明:自己搭建的时候用的是桥接,因为用的是2两个物理机搭建3台虚拟机所以采用桥接便于三个虚拟机在一个网段,但是不知道对后期有没有影响,目前搭建成功   (1)设置桥接方式 查看本地连接网 ...