ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询等
ElasticsearchTemplate是Spring对ES的java api进行的封装,提供了大量的相关的类来完成各种各样的查询。在日常的使用中,应该说最常用的查询就是queryList方法。
public <T> List<T> queryForList(SearchQuery query, Class<T> clazz) {return this.queryForPage(query, clazz).getContent();}
而我们的主要工作就是构建SearchQuery查询条件,包括排序、分页等条件都包含在SearchQuery中。在之前的一篇文章中已经简单的讲过这几个类的继承关系了,这里我们主要看看使用方法(http://blog.csdn.net/tianyaleixiaowu/article/details/76149547 先阅读该篇了解基本的继承关系)。
直接上例子,Post对象
package com.example.demo.pojo;import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName="projectname",type="post",indexStoreType="fs",shards=5,replicas=1,refreshInterval="-1")
public class Post {@Idprivate String id;private String title;private String content;private int userId;private int weight;@Overridepublic String toString() {return "Post{" +"id='" + id + '\'' +", title='" + title + '\'' +", content='" + content + '\'' +", userId=" + userId +", weight=" + weight +'}';}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}
}
import com.example.demo.pojo.Post;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface PostRepository extends ElasticsearchRepository<Post, String> {
}
初始化数据
package com.example.demo.config;import com.example.demo.pojo.Post;
import com.example.demo.repository.PostRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;@Component
public class Init {@AutowiredPostRepository postRepository;@PostConstructpublic void init() {//只初始化一次Iterable<Post> posts = postRepository.findAll();if (posts.iterator().hasNext()) {return;}for (int i = 0; i < 40; i++) {Post post = new Post();post.setTitle(getTitle().get(i));post.setContent(getContent().get(i));post.setWeight(i);post.setUserId(i % 10);postRepository.save(post);}}private List<String> getTitle() {List<String> list = new ArrayList<>();list.add("《如梦令·常记溪亭日暮》");list.add("《醉花阴·薄雾浓云愁永昼》");list.add("《声声慢·寻寻觅觅》");list.add("《永遇乐·落日熔金》");list.add("《如梦令·昨夜雨疏风骤》");list.add("《渔家傲·雪里已知春信至》");list.add("《点绛唇·蹴[1]罢秋千》");list.add("《点绛唇·寂寞深闺》");list.add("《蝶恋花·泪湿罗衣脂粉满》");list.add("《蝶恋花 离情》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《减字木兰花·卖花担上》");list.add("《临江仙·欧阳公作《蝶恋花》");list.add("《临江仙·庭院深深深几许》");list.add("《念奴娇·萧条庭院》");list.add("《菩萨蛮·风柔日薄春犹早》");list.add("《菩萨蛮·归鸿声断残云碧》");list.add("《武陵春·风住尘香花已尽》");list.add("《一剪梅·红藕香残玉蕈秋》");list.add("《渔家傲·天接云涛连晓雾》");list.add("《鹧鸪天·暗淡轻黄体性柔》");list.add("《鹧鸪天·寒日萧萧上锁窗》");list.add("《一剪梅·红藕香残玉簟秋》");list.add("《如梦令·常记溪亭日暮》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《蝶恋花·泪湿罗衣脂粉满》");list.add("《蝶恋花·暖日晴风初破冻》");list.add("《鹧鸪天·寒日萧萧上锁窗》");list.add("《醉花阴·薄雾浓云愁永昼》");list.add("《鹧鸪天·暗淡轻黄体性柔》");list.add("《蝶恋花·永夜恹恹欢意少》");list.add("《浣溪沙》");list.add("《浣溪沙》");list.add("《如梦令·谁伴明窗独坐》");return list;}private List<String> getContent() {List<String> list = new ArrayList<>();list.add("初中 宋·李清照 常记溪亭日暮,沉醉不知归路,兴尽晚回舟,误入藕花深处。争渡,争渡");list.add("重阳节 宋·李清照 薄雾浓云愁永昼,瑞脑消金兽。佳节又重阳,玉枕纱厨,半夜凉初透。东");list.add("闺怨诗 宋·李清照 寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两");list.add("元宵节 宋·李清照 落日熔金,暮云合璧,人在何处。染柳烟浓,吹梅笛怨,春意知几许。元");list.add("婉约诗 宋·李清照 昨夜雨疏风骤,浓睡不消残酒,试问卷帘人,却道海棠依旧。知否,知否");list.add("描写梅花 宋·李清照 雪里已知春信至,寒梅点缀琼枝腻,香脸半开娇旖旎,当庭际,玉人浴出");list.add(" 宋·李清照 蹴罢秋千,起来慵整纤纤手。露浓花瘦,薄汗轻衣透。见客入来,袜刬金");list.add("闺怨诗 宋·李清照 寂寞深闺,柔肠一寸愁千缕。惜春春去。几点催花雨。倚遍阑干,只是无");list.add("婉约诗 宋·李清照 泪湿罗衣脂粉满。四叠阳关,唱到千千遍。人道山长水又断。萧萧微雨闻");list.add("描写春天 宋·李清照 暖雨晴风初破冻,柳眼梅腮,已觉春心动。酒意诗情谁与共?泪融残粉花");list.add("寒食节 宋·李清照 淡荡春光寒食天,玉炉沈水袅残烟,梦回山枕隐花钿。海燕未来人斗草,");list.add(" 宋·李清照 髻子伤春慵更梳,晚风庭院落梅初,淡云来往月疏疏,玉鸭薰炉闲瑞脑,");list.add(" 宋·李清照 莫许杯深琥珀浓,未成沉醉意先融。疏钟已应晚来风。瑞脑香消魂梦断,");list.add("闺怨诗 宋·李清照 小院闲窗春已深,重帘未卷影沉沉。倚楼无语理瑶琴,远岫出山催薄暮。");list.add("爱情诗 宋·李清照 绣幕芙蓉一笑开,斜偎宝鸭亲香腮,眼波才动被人猜。一面风情深有韵,");list.add("描写春天 宋·李清照 卖花担上,买得一枝春欲放。泪染轻匀,犹带彤霞晓露痕。怕郎猜道,奴");list.add("》 宋·李清照 欧阳公作《蝶恋花》,有“深深深几许”之句,予酷爱之。用其语作“庭");list.add("描写梅花 宋·李清照 庭院深深深几许,云窗雾阁春迟,为谁憔悴损芳姿。夜来清梦好,应是发");list.add("寒食节 宋·李清照 萧条庭院,又斜风细雨,重门须闭。宠柳娇花寒食近,种种恼人天气。险");list.add("思乡诗 宋·李清照 风柔日薄春犹早,夹衫乍著心情好。睡起觉微寒,梅花鬓上残。故乡何处");list.add("描写春天 宋·李清照 归鸿声断残云碧,背窗雪落炉烟直。烛底凤钗明,钗头人胜轻。角声催晓");list.add("闺怨诗 宋·李清照 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪");list.add(" 宋·李清照 红藕香残玉蕈秋,轻解罗裳,独上兰舟。云中谁寄锦书来?雁字回时,月");list.add("豪放诗 宋·李清照 天接云涛连晓雾。星河欲转千帆舞。仿佛梦魂归帝所。闻天语。殷勤问我");list.add("描写花 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。");list.add("描写秋天 宋·李清照 寒日萧萧上琐窗,梧桐应恨夜来霜。酒阑更喜团茶苦,梦断偏宜瑞脑香。");list.add("闺怨诗 宋·李清照 红藕香残玉簟秋。轻解罗裳,独上兰舟。云中谁寄锦书来?雁字回时,月");list.add(" 宋·李清照 常记溪亭日暮。沈醉不知归路。兴尽晚回舟,误入藕花深处。争渡。争渡");list.add(" 宋·李清照 莫许杯深琥珀浓。未成沈醉意先融。已应晚来风。瑞脑香消魂梦断,");list.add(" 宋·李清照 小院闲窗春色深。重帘未卷影沈沈。倚楼无语理瑶琴。远岫出山催薄暮,");list.add(" 宋·李清照 淡荡春光寒食天。玉炉沈水袅残烟。梦回山枕隐花钿。海燕未来人斗草,");list.add(" 宋·李清照 泪湿罗衣脂粉满。四叠阳关,唱到千千遍。人道山长山又断。萧萧微雨闻");list.add(" 宋·李清照 暖日晴风初破冻。柳眼眉腮,已觉春心动。酒意诗情谁与共。泪融残粉花");list.add(" 宋·李清照 寒日萧萧上锁窗。梧桐应恨夜来霜。酒阑更喜团茶苦,梦断偏宜瑞脑香。");list.add(" 宋·李清照 薄雾浓云愁永昼。瑞脑消金兽。佳节又重阳,玉枕纱厨,半夜凉初透。东");list.add(" 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。");list.add(" 宋·李清照 永夜恹恹欢意少。空梦长安,认取长安道。为报今年春色好。花光月影宜");list.add(" 宋·李清照 髻子伤春慵更梳。晚风庭院落梅初。淡云来往月疏疏。玉鸭熏炉闲瑞脑,");list.add(" 宋·李清照 绣面芙蓉一笑开。斜飞宝鸭衬香腮。眼波才动被人猜。一面风情深有韵,");list.add(" 宋·李清照 谁伴明窗独坐,我共影儿俩个。灯尽欲眠时,影也把人抛躲。无那,无那");return list;}}
测试开始
定义出来
@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;
1 单字符串全文查询
/*** 单字符串模糊查询,默认排序。将从所有字段中查找包含传来的word分词后字符串的数据集*/@RequestMapping("/singleWord")public Object singleTitle(String word, @PageableDefault Pageable pageable) {//使用queryStringQuery完成单字符串查询SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryStringQuery(word)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
请求 http://localhost:8080/singleWord?word=浣溪沙&size=20
结果:
[{"id": "AV56c5adcu4Vu652ZQrK","title": "《浣溪沙》","content": " 宋·李清照 莫许杯深琥珀浓,未成沉醉意先融。疏钟已应晚来风。瑞脑香消魂梦断,","userId": 2,"weight": 12},{"id": "AV56c5bfcu4Vu652ZQrM","title": "《浣溪沙》","content": "爱情诗 宋·李清照 绣幕芙蓉一笑开,斜偎宝鸭亲香腮,眼波才动被人猜。一面风情深有韵,","userId": 4,"weight": 14},{"id": "AV56c5jdcu4Vu652ZQrb","title": "《浣溪沙》","content": " 宋·李清照 小院闲窗春色深。重帘未卷影沈沈。倚楼无语理瑶琴。远岫出山催薄暮,","userId": 9,"weight": 29},{"id": "AV56c5nfcu4Vu652ZQrj","title": "《浣溪沙》","content": " 宋·李清照 髻子伤春慵更梳。晚风庭院落梅初。淡云来往月疏疏。玉鸭熏炉闲瑞脑,","userId": 7,"weight": 37},{"id": "AV56c5aBcu4Vu652ZQrJ","title": "《浣溪沙》","content": " 宋·李清照 髻子伤春慵更梳,晚风庭院落梅初,淡云来往月疏疏,玉鸭薰炉闲瑞脑,","userId": 1,"weight": 11},{"id": "AV56c5Zucu4Vu652ZQrI","title": "《浣溪沙》","content": "寒食节 宋·李清照 淡荡春光寒食天,玉炉沈水袅残烟,梦回山枕隐花钿。海燕未来人斗草,","userId": 0,"weight": 10},{"id": "AV56c5i-cu4Vu652ZQra","title": "《浣溪沙》","content": " 宋·李清照 莫许杯深琥珀浓。未成沈醉意先融。已应晚来风。瑞脑香消魂梦断,","userId": 8,"weight": 28},{"id": "AV56c5j-cu4Vu652ZQrc","title": "《浣溪沙》","content": " 宋·李清照 淡荡春光寒食天。玉炉沈水袅残烟。梦回山枕隐花钿。海燕未来人斗草,","userId": 0,"weight": 30},{"id": "AV56c5a_cu4Vu652ZQrL","title": "《浣溪沙》","content": "闺怨诗 宋·李清照 小院闲窗春已深,重帘未卷影沉沉。倚楼无语理瑶琴,远岫出山催薄暮。","userId": 3,"weight": 13},{"id": "AV56c5oAcu4Vu652ZQrk","title": "《浣溪沙》","content": " 宋·李清照 绣面芙蓉一笑开。斜飞宝鸭衬香腮。眼波才动被人猜。一面风情深有韵,","userId": 8,"weight": 38},{"id": "AV56c5Uwcu4Vu652ZQq-","title": "《如梦令·常记溪亭日暮》","content": "初中 宋·李清照 常记溪亭日暮,沉醉不知归路,兴尽晚回舟,误入藕花深处。争渡,争渡","userId": 0,"weight": 0},{"id": "AV56c5ifcu4Vu652ZQrZ","title": "《如梦令·常记溪亭日暮》","content": " 宋·李清照 常记溪亭日暮。沈醉不知归路。兴尽晚回舟,误入藕花深处。争渡。争渡","userId": 7,"weight": 27},{"id": "AV56c5e-cu4Vu652ZQrT","title": "《武陵春·风住尘香花已尽》","content": "闺怨诗 宋·李清照 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪","userId": 1,"weight": 21}
]
共13个结果,按照默认的排序方式,即匹配相关度排序,前10个匹配度最高,都是完全带“浣溪沙”三个字的。第10个、11个都是题目和正文都包含“溪”字而且出现了2次“溪”,最后一个是正文带一个“溪”。
我们修改一下排序方式,按照weight从大到小排序
/*** 单字符串模糊查询,单字段排序。*/@RequestMapping("/singleWord1")public Object singlePost(String word, @PageableDefault(sort = "weight", direction = Sort.Direction.DESC) Pageable pageable) {//使用queryStringQuery完成单字符串查询SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(queryStringQuery(word)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
请求:
http://localhost:8080/singleWord1?word=浣溪沙&size=20
结果:
[{"id": "AV56c5oAcu4Vu652ZQrk","title": "《浣溪沙》","content": " 宋·李清照 绣面芙蓉一笑开。斜飞宝鸭衬香腮。眼波才动被人猜。一面风情深有韵,","userId": 8,"weight": 38},{"id": "AV56c5nfcu4Vu652ZQrj","title": "《浣溪沙》","content": " 宋·李清照 髻子伤春慵更梳。晚风庭院落梅初。淡云来往月疏疏。玉鸭熏炉闲瑞脑,","userId": 7,"weight": 37},{"id": "AV56c5j-cu4Vu652ZQrc","title": "《浣溪沙》","content": " 宋·李清照 淡荡春光寒食天。玉炉沈水袅残烟。梦回山枕隐花钿。海燕未来人斗草,","userId": 0,"weight": 30},{"id": "AV56c5jdcu4Vu652ZQrb","title": "《浣溪沙》","content": " 宋·李清照 小院闲窗春色深。重帘未卷影沈沈。倚楼无语理瑶琴。远岫出山催薄暮,","userId": 9,"weight": 29},{"id": "AV56c5i-cu4Vu652ZQra","title": "《浣溪沙》","content": " 宋·李清照 莫许杯深琥珀浓。未成沈醉意先融。已应晚来风。瑞脑香消魂梦断,","userId": 8,"weight": 28},{"id": "AV56c5ifcu4Vu652ZQrZ","title": "《如梦令·常记溪亭日暮》","content": " 宋·李清照 常记溪亭日暮。沈醉不知归路。兴尽晚回舟,误入藕花深处。争渡。争渡","userId": 7,"weight": 27},{"id": "AV56c5e-cu4Vu652ZQrT","title": "《武陵春·风住尘香花已尽》","content": "闺怨诗 宋·李清照 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪","userId": 1,"weight": 21},{"id": "AV56c5bfcu4Vu652ZQrM","title": "《浣溪沙》","content": "爱情诗 宋·李清照 绣幕芙蓉一笑开,斜偎宝鸭亲香腮,眼波才动被人猜。一面风情深有韵,","userId": 4,"weight": 14},{"id": "AV56c5a_cu4Vu652ZQrL","title": "《浣溪沙》","content": "闺怨诗 宋·李清照 小院闲窗春已深,重帘未卷影沉沉。倚楼无语理瑶琴,远岫出山催薄暮。","userId": 3,"weight": 13},{"id": "AV56c5adcu4Vu652ZQrK","title": "《浣溪沙》","content": " 宋·李清照 莫许杯深琥珀浓,未成沉醉意先融。疏钟已应晚来风。瑞脑香消魂梦断,","userId": 2,"weight": 12},{"id": "AV56c5aBcu4Vu652ZQrJ","title": "《浣溪沙》","content": " 宋·李清照 髻子伤春慵更梳,晚风庭院落梅初,淡云来往月疏疏,玉鸭薰炉闲瑞脑,","userId": 1,"weight": 11},{"id": "AV56c5Zucu4Vu652ZQrI","title": "《浣溪沙》","content": "寒食节 宋·李清照 淡荡春光寒食天,玉炉沈水袅残烟,梦回山枕隐花钿。海燕未来人斗草,","userId": 0,"weight": 10},{"id": "AV56c5Uwcu4Vu652ZQq-","title": "《如梦令·常记溪亭日暮》","content": "初中 宋·李清照 常记溪亭日暮,沉醉不知归路,兴尽晚回舟,误入藕花深处。争渡,争渡","userId": 0,"weight": 0}
]
可以看到排序已经按照weight从大到小来排了,比字符串匹配度的权重更大。
2 某字段按字符串模糊查询
查询某个字段中模糊包含目标字符串,使用matchQuery
/*** 单字段对某字符串模糊查询*/@RequestMapping("/singleMatch")public Object singleMatch(String content, Integer userId, @PageableDefault Pageable pageable) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("content", content)).withPageable(pageable).build();
// SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("userId", userId)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
请求:
http://localhost:8080/singleMatch?content=落日熔金&size=20
部分结果:
结果集是content字段包含“落日熔金”相关字样。
把注释放开,我们可以尝试用userId查询,http://localhost:8080/singleMatch?userId=1&size=20
matchQuery应该是比较常用的功能。
3 PhraseMatch查询,短语匹配
/*** 单字段对某短语进行匹配查询,短语分词的顺序会影响结果*/@RequestMapping("/singlePhraseMatch")public Object singlePhraseMatch(String content, @PageableDefault Pageable pageable) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("content", content)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
结果只有一条:
[{"id": "AV56c5WDcu4Vu652ZQrB","title": "《永遇乐·落日熔金》","content": "元宵节 宋·李清照 落日熔金,暮云合璧,人在何处。染柳烟浓,吹梅笛怨,春意知几许。元","userId": 3,"weight": 3}
]
@RequestMapping("/add")public Object add() {Post post = new Post();post.setTitle("我是");post.setContent("我爱中华人民共和国");post.setWeight(1);post.setUserId(1);postRepository.save(post);post = new Post();post.setTitle("我是");post.setContent("中华共和国");post.setWeight(2);post.setUserId(2);return postRepository.save(post);}
使用如下方法:
@RequestMapping("/singlePhraseMatch")public Object singlePhraseMatch(String content, @PageableDefault Pageable pageable) {
// SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("content", content)).withPageable(pageable).build();//少匹配一个分词也OK、SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchPhraseQuery("content", content).slop(2)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
[{"id": "AV5-ekRHcu4Vu652ZQrw","title": "我是","content": "中华共和国","userId": 2,"weight": 2},{"id": "AV5-ekBvcu4Vu652ZQrv","title": "我是","content": "我爱中华人民共和国","userId": 1,"weight": 1}
]
关于slop的解释,可以看看这一篇http://blog.csdn.net/xifeijian/article/details/51090707
我们可以在短语匹配使用slop参数来引入一些灵活性:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配。相隔多远的意思是,你需要移动一个词条多少次来让查询和文档匹配?
我们以一个简单的例子来阐述这个概念。为了让查询quick fox能够匹配含有quick brown fox的文档,我们需要slop的值为1:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: quick fox
Slop 1: quick ↳ fox
尽管在使用了slop的短语匹配中,所有的单词都需要出现,但是单词的出现顺序可以不同。如果slop的值足够大,那么单词的顺序可以是任意的。
为了让fox quick查询能够匹配我们的文档,需要slop的值为3:
Pos 1 Pos 2 Pos 3
-----------------------------------------------
Doc: quick brown fox
-----------------------------------------------
Query: fox quick
Slop 1: fox|quick ↵
Slop 2: quick ↳ fox
Slop 3: quick ↳ fox
4 Term查询
/*** term匹配,即不分词匹配,你传来什么值就会拿你传的值去做完全匹配*/@RequestMapping("/singleTerm")public Object singleTerm(Integer userId, @PageableDefault Pageable pageable) {//不对传来的值分词,去找完全匹配的SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("userId", userId)).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
我们可以用这个来做那种需要==查询的操作,当传userId=1时,会查询出来所有userId为1的集合。
5 multi_match多个字段匹配某字符串
/*** 多字段匹配*/@RequestMapping("/multiMatch")public Object singleUserId(String title, @PageableDefault(sort = "weight", direction = Sort.Direction.DESC) Pageable pageable) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(multiMatchQuery(title, "title", "content")).withPageable(pageable).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
访问http://localhost:8080/multiMatch?title=我是
[{"id": "AV56c5oicu4Vu652ZQrl","title": "《如梦令·谁伴明窗独坐》","content": " 宋·李清照 谁伴明窗独坐,我共影儿俩个。灯尽欲眠时,影也把人抛躲。无那,无那","userId": 9,"weight": 39},{"id": "AV56c5mecu4Vu652ZQrh","title": "《鹧鸪天·暗淡轻黄体性柔》","content": " 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。","userId": 5,"weight": 35},{"id": "AV56c5g0cu4Vu652ZQrW","title": "《鹧鸪天·暗淡轻黄体性柔》","content": "描写花 宋·李清照 暗淡轻黄体性柔。情疏迹远只香留。何须浅碧深红色,自是花中第一流。","userId": 4,"weight": 24},{"id": "AV56c5gIcu4Vu652ZQrV","title": "《渔家傲·天接云涛连晓雾》","content": "豪放诗 宋·李清照 天接云涛连晓雾。星河欲转千帆舞。仿佛梦魂归帝所。闻天语。殷勤问我","userId": 3,"weight": 23},{"id": "AV56c5e-cu4Vu652ZQrT","title": "《武陵春·风住尘香花已尽》","content": "闺怨诗 宋·李清照 风住尘香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪","userId": 1,"weight": 21},{"id": "AV56c5c7cu4Vu652ZQrP","title": "《临江仙·庭院深深深几许》","content": "描写梅花 宋·李清照 庭院深深深几许,云窗雾阁春迟,为谁憔悴损芳姿。夜来清梦好,应是发","userId": 7,"weight": 17},{"id": "AV56c5YGcu4Vu652ZQrF","title": "《点绛唇·寂寞深闺》","content": "闺怨诗 宋·李清照 寂寞深闺,柔肠一寸愁千缕。惜春春去。几点催花雨。倚遍阑干,只是无","userId": 7,"weight": 7},{"id": "AV5-ekRHcu4Vu652ZQrw","title": "我是","content": "中华共和国","userId": 2,"weight": 2},{"id": "AV5-ekBvcu4Vu652ZQrv","title": "我是","content": "我爱中华人民共和国","userId": 1,"weight": 1}
]
可以看到,无论是title还是content中,包含“我”“是”字样的都被查询了出来。
MultiMatch还有一些其他的属性,
包括Type、tieBreaker等的解释看下图
以上图片来源于http://www.cnblogs.com/yjf512/p/4897294.html
完全包含查询
/*** 单字段包含所有输入*/@RequestMapping("/contain")public Object contain(String title) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", title).operator(MatchQueryBuilder.Operator.AND)).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
无论是matchQuery,multiMatchQuery,queryStringQuery等,都可以设置operator。默认为Or,设置为And后,就会把符合包含所有输入的才查出来。
/*** 单字段包含所有输入(按比例包含)*/@RequestMapping("/contain")public Object contain(String title) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("title", title).operator(MatchQueryBuilder.Operator.AND).minimumShouldMatch("75%")).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
minimumShouldMatch可以用在match查询中,设置最少匹配了多少百分比的能查询出来。
合并查询
即boolQuery,可以设置多个条件的查询方式。它的作用是用来组合多个Query,有四种方式来组合,must,mustnot,filter,should。
/*** 多字段合并查询*/@RequestMapping("/bool")public Object bool(String title, Integer userId, Integer weight) {SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery().must(termQuery("userId", userId)).should(rangeQuery("weight").lt(weight)).must(matchQuery("title", title))).build();return elasticsearchTemplate.queryForList(searchQuery, Post.class);}
详细点的看这篇http://blog.csdn.net/dm_vincent/article/details/41743955
boolQuery使用场景非常广泛,应该是主要学习的知识之一。
Query和Filter的区别
1、查询:是在使用query进行查询时的执行环境,比如使用search的时候。
在查询上下文中,查询会回答这个问题——“这个文档是否匹配这个查询,它的相关度高么?”
ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,对于某个搜索的分值计算还是需要一定的时间消耗。
2、过滤器:在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter
在过滤器上下文中,查询会回答这个问题——“这个文档是否匹配?”
它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。
另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。
总而言之:
1 查询上下文:查询操作不仅仅会进行查询,还会计算分值,用于确定相关度;
2 过滤器上下文:查询操作仅判断是否满足查询条件,不会计算得分,查询的结果可以被缓存。
所以,根据实际的需求是否需要获取得分,考虑性能因素,选择不同的查询子句。
ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询等相关推荐
- ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询 . . .
ElasticsearchTemplate是Spring对ES的java api进行的封装,提供了大量的相关的类来完成各种各样的查询.在日常的使用中,应该说最常用的查询就是queryList方法. p ...
- Mysql 获取模糊,根据模糊查询匹配度大小排序
方法一: 根据匹配结果的长短排序 select * from audit_manage_pro where pro_name LIKE '%集成电路%' ORDER BY ABS(LENGTH(pro ...
- spring cloud 集成elasticsearch 实现分词查询和模糊查询
使用elasticsearch 主要的一个场景就是分词查询,我以电商搜索商品为例:搜索"精华乳液套装" 搜索引擎(ik分词器)会拆成 精华.乳液.套装分别去匹配字段,会根据匹配度计 ...
- jpa命名 多条件查询命名_JPA 2 | 动态查询与命名查询
jpa命名 多条件查询命名 JPA有自己的查询语言,称为JPQL. JPQL与SQL非常相似,主要区别在于JPQL与应用程序中定义的实体一起使用,而SQL与数据库中定义的表和列名称一起使用. 在定义将 ...
- 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...
- MySQL基础——数据库和SQL概述\MySQL基本使用\DQL语言学习\条件查询\排序查询\常见函数\分组查询\连接查询\子查询\分页查询\联合查询
本文详细讲解了MySQL中DQL语言,也就是数据查询语句的使用.全文3w余字,是对学习MySQL知识的整理总结,因为篇幅较长,MySQL基础知识余下部分发表在余下博客中 DML语言学习\插入数据\删除 ...
- php,tp5关键词,分词模糊查询并根据查询条件排序
php,tp5关键词,分词模糊查询并根据查询条件排序 1.大概需求是我这边搜索"维修工",需要先搜索维修工再搜索维修,用一般模糊查询的话会导致维修的词出不来,所有这边需要先进行分词 ...
- 数据库:数据查询(指定的列、全部列、经过计算的值、消除重复的行、查询满足条件的元组、比较查询、范围查询、集合查询、字符匹配查询)
数据查询是数据库的核心操作,SQL提供了 select 语句实现查询功能 1.查询指定的列 格式: select 查询列表,查询列表 from 查询的表名 2.查询全部列(查询的顺序不同) (1) s ...
- ElasticSearch封装查询、多条件查询、模糊查询工具类
这个EsTool类是根据自身业务写成的,因为业务暂时想法不难. 需要的主要是:1.精确查询 (单/多条件) 2.模糊查询 (单/多条件) 前提:Mapping全部设置"index&quo ...
- mysql数据库实验实训5,数据查询yggl数据库查询(详细)
数据库实验yggl数据库,实训5(详细版) 1.SELECT语句的基本使用: 1-1:查询employees 表的员工部门号和性别,要求消除重复行 select distinct '员工部门号','性 ...
最新文章
- python操作Excel读写--使用xlrd
- 读书笔记九:TCP/IP详解之广播和多播,IGMP协议
- scrapy startproject【学习笔记02】
- python与办公自动化专业就业方向_Python最好的几大就业方向与岗位技能要求【行业风向】...
- es 基本API操作使用
- Android IntentService使用
- servlet以及HTML中路径问题
- Word没有到一行自动换行如何解决
- animation和keyframes
- 极光尔沃3D打印《英雄联盟》精美手板
- 在HBuilderX上面新建微信小程序项目
- HTML生成Word文档,可自定义Word文档页眉、页脚、分页。
- 为何基于树的模型在表格型数据中能优于深度学习?
- 解除隐藏已购项目_从AppStore的已购项目中隐藏已经购买的APP
- DVWA之CSRF攻击
- Go 相关问题及解决办法汇总
- GCC源代码分析(1): GCC中的树
- 探索性分析——某医院18年销售数据分析
- 抖音短视频开发项目跨入社交圈,头条实现社交梦?...
- 计算机与scp通讯发生故障,在两台远程计算机之间使用scp命令时权限被拒绝错误...
热门文章
- CNN(卷积神经网络)的深度
- html静态页面作业——品牌红酒销售网页模板(4页) html网页设计期末大作业_网页设计平时作业
- android 真正的全屏沉浸式实现
- Partial Dependence Plots - 部分依赖图实践
- 编程:中国有句俗话“三天打鱼两天晒网”,某人从1990年1月1日起三天打鱼两天晒网,编程计算他在某一天是打鱼还是晒网
- 北航计算机学院好气派,2017年北京航空航天大学国内排名第几
- dedecms调用友情链接代码
- 怎么用python下载视频_用python一行代码批量下载哔哩哔哩视频
- 关于CDN加速 CDN加速是什么
- 连线封面:2亿多支付宝用户选择的背后,一个数据与评分带来的「等级世界」