ElasticSearch 实现分词全文检索 - term、terms查询

elasticsearch,实现,分词,全文检索,term,terms,查询 · 浏览次数 : 367

小编点评

**ElasticSearch 实现分词全文检索** **1. 什么是分词全文检索?** 分词全文检索是一种搜索技术,它将文本内容分词成更小的词语,以便在搜索时进行更精确的匹配。 **2. 如何使用 Elasticsearch 实现分词全文检索?** 可以使用 Elasticsearch 的搜索源 builder 或 query builder 来构建查询条件,并使用 match、match_all、multimatch 等查询操作来进行分词搜索。 **3. 示例代码** ```java // 使用 Spring Boot 和 Elasticsearch 实现分词全文检索 @SpringBootTest public class ElasticsearchSplitWordSearch { private final String indexName = "sms-logs-index"; @Autowired private RestHighLevelClient client; // 示例查询条件,使用 terms 查询所有包含 "江苏" 的词语 private SearchSourceBuilder builder = new SearchSourceBuilder<>(); builder.query(QueryBuilders.termsQuery("province", "江苏")); @Test public void termQuery() throws Exception { // 执行查询 SearchResponse response = client.search(builder.build(), RequestOptions.DEFAULT); // 打印查询结果 for (SearchHit hit : response.getHits().getHits()) { Map source = hit.getSourceAsMap(); System.out.println(source); } } // 示例使用 terms 查询所有包含 "江苏" 或 "上海" 的词语 private void termsQuery() throws Exception { builder.query(QueryBuilders.termsQuery("province", "江苏", "上海")); // 执行查询 SearchResponse response = client.search(builder.build(), RequestOptions.DEFAULT); // 打印查询结果 for (SearchHit hit : response.getHits().getHits()) { Map source = hit.getSourceAsMap(); System.out.println(source); } } } ``` **4. 总结** 使用 Elasticsearch 实现分词全文检索需要构建查询条件并使用 match、match_all、multimatch 等查询操作进行分词搜索。 **5. 其他资源** * Elasticsearch 分词器:www.sojson.com/analyzer * 使用 Spring Boot 和 Elasticsearch 实现分词全文检索教程:Introduction to Elasticsearch full-text search with Spring Boot and Elasticsearch

正文

目录

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 实现分词全文检索 - 测试数据准备

ElasticSearch的各种查询

不会对查询关键字进行分词

term 查询

term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中的去匹配内容

# term 查询 -- 完整匹配
POST /sms-logs-index/_search
{
  "from":0,
  "size":5,  //获取5条,类似分页
  "query":{
    "term": {
      "province": {
        "value": "江苏"
      }
    }
  }
}

返回值

{
  "took" : 1,  //执行花了ms
  "timed_out" : false, //没有超时
  "_shards" : {
    "total" : 1,  //总共多少分片
    "successful" : 1, //成功了多少分片
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {  //hits 中是我们要看的数据
    "total" : {
      "value" : 10,  //一共查了N条
      "relation" : "eq"
    },
    "max_score" : 0.046520013,  //匹配程度,匹配度越高,分数越高
    "hits" : [
      {
        "_index" : "sms-logs-index",
        "_type" : "_doc",
        "_id" : "Q5XEloYBGlLaT58Lnwjj",
        "_score" : 0.046520013,
        "_source" : {  //完成内容
          "corpName" : "corpName1",
          "createDate" : "2023-02-28 14:45:14",
          "fee" : 47,
          "ipAddr" : "172.16.0.66",
          "longCode" : "张三1",
          "mobile" : "13845591752",
          "operatorld" : 1,
          "province" : "江苏",
          "sendDate" : "2023-02-28 14:43:14",
          "smsContent" : "【阿里云】尊敬的vipsoft:您有2台云服务器ECS配置升级成功。如有CPU、内存变更或0Mbps带宽升级,您需要在ECS控制台手动重启云服务器后才能生效。",
          "state" : 1
        }
      },

SpringBoot 代码term查询

@Test
void termQuery() throws Exception{
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建Request对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.from(0);
    builder.size(5);
    builder.query(QueryBuilders.termQuery("province","江苏"));

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

terms 查询

terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。
terms是在针对一个字段包含多个值的时候使用。
term: where province = 江苏
terms: where province = 江苏 or province = ? or province = ?

Restful

# terms 查询
POST /sms-logs-index/_search
{
  "query":{
    "terms": {
      "province": [
        "江苏",
        "上海"
      ]
    }
  }
}

Java

@Test
void termsQuery() 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.termsQuery("province","江苏","上海"));

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

在线ik分词器:https://www.sojson.com/analyzer
image
image
image

与ElasticSearch 实现分词全文检索 - term、terms查询相似的内容:

ElasticSearch 实现分词全文检索 - term、terms查询

term 查询 term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中的去匹配内容 terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。 terms是在针对一个字段包含多个值的时候使用。 term: where province = 江苏 terms: where province = 江苏 or p

ElasticSearch 实现分词全文检索 - delete-by-query

delete-by-query 根据 term、match 等查询方式去删除大量的文档 > 如果需要删除的内容,是index下的大部分数据,不建议使用,因为去匹配文档时还是一个一个的拿到文档ID,去删除 推荐创建一个全新的index,将保留的文档内容,添加到全新的索引中

ElasticSearch 实现分词全文检索 - 概述

ES 是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于Restful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装

先把zip下载下来。放到任意一台服务器(直接github上下载多数会失败)elasticsearch-plugin install http://172.16.0.183:8899/Java/elasticsearch-analysis-ik-7.9.3.zip

ElasticSearch 实现分词全文检索 - Restful基本操作

GET 请求: ``` http://ip:port/index: 查询索引信息 http://ip;port/index/type/doc_id: 查询指定的文档信息 ``` POST 请求: ``` http://ip;port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件 http://ip;port/index/type/doc_id/

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

//1. 准备索引的 settings Settings.Builder settings = Settings.builder() //2. 准备索引的结构 Mappings XContentBuilder mappings = JsonXContent.contentBuilder() //3. 将 Settings 和 Mappings 封装到一个Request 对象中

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

//准备一个Request对象 IndexRequest request = new IndexRequest(indexName); request.id(person.getId().toString()); //手动指定ID request.source(personJson, XContentType.JSON); //通过 Client 对象执行

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

String json = JSON.toJSONStringWithDateFormat(sms, "yyyy-MM-dd HH:mm:ss"); FastJson 将日期格式化 BulkRequest bulkRequest = new BulkRequest(); Integer idx = 1; for (String json : jsonList) {

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

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

ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询

fuzzy查询:模糊查询,我们输入字符的大概,ES就可以 wildcard 查询:通配查询,和MySQL中的 like 差不多,可以在查询时,在字符串中指定通配符 * 和占位符? range 查询:范围查询,只针对数值类型,对某一个Field进行大于或小于的范围指定查询 regexp 查询: 正则查询,通过你编写的正则表达式去匹配内容