ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match

这篇具有很好参考价值的文章主要介绍了ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html
权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html

1. 数据准备

官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。

PUT /user/_doc/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports"]
}

PUT /user/_doc/2
{
    "first_name" : "zhangsan",
    "last_name" :  "Smith",
    "age" :        19,
    "about" :      "我是一个安静的人",
    "interests": [ "read" ]
}

PUT /user/_doc/3
{
    "first_name" : "lisi",
    "last_name" :  "Alice",
    "age" :        29,
    "about" :      "我喜欢规划自己的生活",
    "interests": [ "sports", "read","music" ]
}

2. match 匹配查询

在匹配之前分析提供的文本,返回与提供的文本、数字、日期或布尔值匹配的文档。 该match查询是执行全文搜索的标准查询,包括模糊匹配选项。

1. 全文检索

① 底层分词器会对查询文本分词,匹配about字段中含有go或者含有rock的文档:

GET /user/_search
{
    "query": {
        "match" : {
            "about" : {
                "query" : "go rock"
            }
        }
    }
}

② 对应的Java调用:

@Slf4j
@Service
public class ElasticSearchImpl {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void searchUser() throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","go rock");
        searchSourceBuilder.query(matchQueryBuilder);

        SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}

③ 查询的结果:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 7,
    "successful" : 7,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.464436,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.464436,
        "_source" : {
          "first_name" : "John",
          "last_name" : "Smith",
          "age" : 25,
          "about" : "I love to go rock climbing",
          "interests" : [
            "sports"
          ]
        }
      }
    ]
  }
}
2. 简化查询DSL语句
GET /user/_search
{
    "query": {
        "match" : {
            "about" : {
                "query" : "我是一个"
            }
        }
    }
}

可以简化查询为:

GET /user/_search
{
    "query": {
        "match" : {
            "about" : "我是一个"
        }
    }
}
{
  "took" : 25,
  "timed_out" : false,
  "_shards" : {
    "total" : 7,
    "successful" : 7,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.8478274,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 2.8478274,
        "_source" : {
          "first_name" : "zhangsan",
          "last_name" : "Smith",
          "age" : 19,
          "about" : "我是一个安静的人",
          "interests" : [
            "read"
          ]
        }
      },
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.6810339,
        "_source" : {
          "first_name" : "lisi",
          "last_name" : "Alice",
          "age" : 29,
          "about" : "我喜欢规划自己的生活",
          "interests" : [
            "sports",
            "read",
            "music"
          ]
        }
      }
    ]
  }
}

3. match 匹配查询原理

查询match的类型为boolean。这意味着对提供的文本进行了分析,分析过程根据提供的文本构造了一个布尔查询。该operator参数可以设置为orand 来控制布尔子句(默认为or),如果为and代表所有字段都要匹配,如果为or代表匹配分词后的任何一个词。

① 带有operator参数and搜索条件,匹配的文档需要包含文本的所有分词,少一个都不行:

GET /user/_search
{
    "query": {
        "match" : {
            "about" : {
                "query" : "是一安静个我",
                "operator" : "and"
            }
        }
    }
}
@Slf4j
@Service
public class ElasticSearchImpl {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void searchUser() throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","是一安静个我");
        // 设置Operator参数
        matchQueryBuilder.operator(Operator.AND);
        searchSourceBuilder.query(matchQueryBuilder);

        SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 2.8478274,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 2.8478274,
        "_source" : {
          "first_name" : "zhangsan",
          "last_name" : "Smith",
          "age" : 19,
          "about" : "我是一个安静的人",
          "interests" : [
            "read"
          ]
        }
      }
    ]
  }
}

② 带有operator参数or搜索条件,匹配的文档需要包含文本的任意一个分词:文章来源地址https://www.toymoban.com/news/detail-403747.html

GET /user/_search
{
    "query": {
        "match" : {
            "about" : "是一个我"
        }
    }
}
@Slf4j
@Service
public class ElasticSearchImpl {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    public void searchUser() throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","是一个我");
        // 设置Operator参数
        matchQueryBuilder.operator(Operator.OR);
        searchSourceBuilder.query(matchQueryBuilder);

        SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}
{
  "took" : 29,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.8478274,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 2.8478274,
        "_source" : {
          "first_name" : "zhangsan",
          "last_name" : "Smith",
          "age" : 19,
          "about" : "我是一个安静的人",
          "interests" : [
            "read"
          ]
        }
      },
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.6810339,
        "_source" : {
          "first_name" : "lisi",
          "last_name" : "Alice",
          "age" : 29,
          "about" : "我喜欢规划自己的生活",
          "interests" : [
            "sports",
            "read",
            "music"
          ]
        }
      }
    ]
  }
}

到了这里,关于ElasticSearch系列 - SpringBoot整合ES之全文搜索匹配查询 match的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch系列 - SpringBoot整合ES:实现分页搜索 from+size、search after、scroll

    01. 数据准备 ElasticSearch 向 my_index 索引中索引了 12 条文档: 02. ElasticSearch 如何查询所有文档? ElasticSearch 查询所有文档 根据查询结果可以看出,集群中总共有12个文档,hits.total.value=12, 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档? 03. ElasticSearch 如何指定搜

    2023年04月08日
    浏览(26)
  • 18、全文检索--Elasticsearch-- SpringBoot 整合 Spring Data Elasticsearch(异步方式(Reactive)和 传统同步方式 分别操作ES的代码演示)

    启动命令行窗口,执行:elasticsearch 命令即可启动 Elasticsearch 服务器 三种查询方式解释: 方法名查询: 就是全自动查询,只要按照规则来定义查询方法 ,Spring Data Elasticsearch 就会帮我们生成对应的查询语句,并且生成方法体。 @Query 查询 : 就是半自动查询, 按照 S

    2024年03月12日
    浏览(50)
  • Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

    不同于之前的term。terms等结构化查询,全文搜索首先对查询词进行分析,然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据(text类型),默认的数据形式是人类的自然语言,如对话内容、图书名称、商品介绍和酒店名称等。结构化搜索关注的是数据是

    2024年02月11日
    浏览(39)
  • Elasticsearch的全文搜索与匹配

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库,用于实现全文搜索和实时分析。它具有高性能、高可扩展性和高可用性,适用于大规模数据的搜索和分析。Elasticsearch的核心功能包括文档存储、搜索引擎、分析引擎和数据可视化。 Elasticsearch的全文搜索功能是其最重要的

    2024年02月22日
    浏览(31)
  • 【Elasticsearch】SpringBoot整合ES实现搜索功能 | 高亮显示

    先看代码: controller: serviceImpl: 小结 : 1、添加ES场景启动器 2、yaml配置ES 3、准备需要用到的变量 注:还有一个注入的RestHighLevelClient 结构如下: 具体调用的方法以及设置页码等参看代码。 加断点查看对应searchResponse数据结构: HighlightFields的数据结构: 对照kinaba结果: 3、根

    2024年02月11日
    浏览(33)
  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(106)
  • 搜索引擎ElasticSearch分布式搜索和分析引擎学习,SpringBoot整合ES个人心得

    Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,

    2024年02月04日
    浏览(53)
  • ElasticSearch系列 - SpringBoot整合ES:分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2024年02月06日
    浏览(46)
  • ElasticSearch系列 - SpringBoot整合ES:多个精确值查询 terms

    ElasticSearch - SpringBoot整合ES:多个精确值查询 terms 01. ElasticSearch terms 查询支持的数据类型 在Elasticsearch中,terms查询支持多种数据类型,包括: 字符串类型:可以将多个字符串值作为数组传递给terms查询,以匹配包含任何一个指定字符串值的文档。 数值类型:可以将多个数值作

    2024年02月16日
    浏览(54)
  • ElasticSearch系列 - SpringBoot整合ES:组合多个查询条件 bool 查询

    01. ElasticSearch 布尔查询是什么? 在实际应用中,我们很有可能会查询多个值或字段。 一个 bool 查询由三部分组成: must:所有的语句都必须(must) 匹配,与 AND 等价。 must_not:所有的语句都不能(must not)匹配,与 NOT 等价。 should:至少有一个语句要匹配,与 OR 等价。 02.

    2023年04月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包