ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

简介: ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

match 查询

match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。

  • 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。
  • 如果查询的内容是一个不能被分词的内容 (keyword) ,match查询不会对你指定的查询关键字进行分词。
  • 如果查询的内容时一个可以被分词的内容 (text),match会将你指定的查询内容根据一定的方式去分词,去分词库中匹配指定的内容。

match查询,实际底层就是多个term查询,将多个term查询的结果给你封装到了一起

match_all 查询

查出全部内容,不指定任何查询条件。

# 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);
    }
}

march 查询

周末快乐 => 周末,周,末,快乐

指定 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);
    }
}

布尔match 查询

基于一个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);
    }
}

multi_match 查询

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);
    }
}
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
自然语言处理 大数据 应用服务中间件
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务
364 5
|
自然语言处理 Java 网络架构
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
这篇文章是关于如何自定义Elasticsearch的ik分词器配置以满足特定的中文分词需求。
777 0
elasticsearch学习三:elasticsearch-ik分词器的自定义配置 分词内容
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
727 20
|
测试技术 API 开发工具
ElasticSearch的IK分词器
ElasticSearch的IK分词器
285 7
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
959 4
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
1436 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
417 0
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
387 0
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
2119 64
|
11月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
5791 0