ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 经纬度查询
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(suggest)
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码
ElasticSearch 实现分词全文检索 - 测试数据准备
match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。
match查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起
查出全部内容,不指定任何查询条件。
# match_all 查询
POST /sms-logs-index/_search
{
"query":{
"match_all": { #不指定,查出全部内容(如果数据比较多,默认只查出 10 条)
}
}
}
Java
@Test
void matchAllQuery() throws Exception{
String indexName = "sms-logs-index";
RestHighLevelClient client = ESClient.getClient();
//1. 创建Request对象
SearchRequest request = new SearchRequest(indexName);
//2. 指定查询条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchAllQuery());
builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size
request.source(builder);
//3. 执行查询
SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
//4. 获取到 _source 中的数据,并展示
for (SearchHit hit : resp.getHits().getHits()) {
Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
周末快乐 => 周末,周,末,快乐
指定 feild 做为查询条件
POST /sms-logs-index/_search
{
"query":{
"match": {
"smsContent": "周末快乐" #先分词,再查询
}
}
}
@Test
void matchQuery() throws Exception{
String indexName = "sms-logs-index";
RestHighLevelClient client = ESClient.getClient();
//1. 创建Request对象
SearchRequest request = new SearchRequest(indexName);
//2. 指定查询条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("smsContent","周末快乐"));
builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size
request.source(builder);
//3. 执行查询
SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
//4. 获取到 _source 中的数据,并展示
for (SearchHit hit : resp.getHits().getHits()) {
Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
基于一个Field匹配的内容,采用 and或 or 的方式 连接
POST /sms-logs-index/_search
{
"query":{
"match": {
"smsContent":{
"query": "开心 快乐", #内容包括开心 并且 包括快乐
"operator": "and"
}
}
}
}
Java
@Test
void booleanMatchQuery() throws Exception{
String indexName = "sms-logs-index";
RestHighLevelClient client = ESClient.getClient();
//1. 创建Request对象
SearchRequest request = new SearchRequest(indexName);
//2. 指定查询条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("smsContent","开心 快乐").operator(Operator.AND)); //多个.operator(Operator.AND)
builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size
request.source(builder);
//3. 执行查询
SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
//4. 获取到 _source 中的数据,并展示
for (SearchHit hit : resp.getHits().getHits()) {
Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
match 针对一个field做检索,multi_match 针对多个 field 进行检索。多个 field 对应一个text
# 布尔match 查询
POST /sms-logs-index/_search
{
"query":{
"multi_match": {
"query": "江苏", #指定 text
"fields": ["province","smsContent"] #指定field
}
}
}
Java
@Test
void multiMatchQuery() throws Exception{
String indexName = "sms-logs-index";
RestHighLevelClient client = ESClient.getClient();
//1. 创建Request对象
SearchRequest request = new SearchRequest(indexName);
//2. 指定查询条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.multiMatchQuery("江苏","province","smsContent"));
builder.size(20); //ES 默认只查询10条数据,如果想查询更多,添加 Size
request.source(builder);
//3. 执行查询
SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
//4. 获取到 _source 中的数据,并展示
for (SearchHit hit : resp.getHits().getHits()) {
Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
ES 是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于Restful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。