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

elasticsearch,实现,分词,全文检索,delete,by,query · 浏览次数 : 92

小编点评

# ElasticSearch 实现分词全文检索 ## 概述 ElasticSearch 提供分词搜索功能,允许您使用多个分词词来搜索文本。这使得您可以搜索包含多个关键词的文本片段。 ## 安装和配置 1. 下载和安装 ElasticSearch。 2. 配置您的 JVM 中的 Elasticsearch 驱动程序。 3. 创建索引。 ## RESTful 基本操作 使用以下 RESTful API 进行分词搜索: - `POST /sms-logs-index/_search`:搜索在 `sms-logs-index` 中的文档中。 - `GET /sms-logs-index/_search/{query}`:根据搜索字符串 `query` 查询文档。 - `POST /sms-logs-index/_delete_by_query`:根据搜索字符串 `query` 从索引中删除文档。 ## Java SpringBoot ES 索引操作 ```java @SpringBootTest public class ElasticsearchExample { @Autowired private ElasticsearchClient client; @Test public void indexAndSearch() { // 创建索引 client.indices.create("sms-logs-index"); // 创建文档 Document document = new Document(); document.put("fee", 16); client.index("sms-logs-index", document); // 查询文档 Query query = QueryBuilders.rangeQuery("fee").lt(16); SearchResult searchResult = client.search(query, Request.builder().build()); // 打印结果 System.out.println(searchResult.getTotalHits()); } } ``` ## Java SpringBoot ES 文档操作 ```java @SpringBootTest public class ElasticsearchDocumentOperations { @Autowired private ElasticsearchClient client; @Test public void createDocument() { // 创建文档 Document document = new Document(); document.put("name", "John Doe"); document.put("age", 30); client.index("users-index", document); } @Test public void updateDocument() { // 更新文档 Document document = new Document(); document.put("age", 35); client.index("users-index", document, "docid"); } @Test public void deleteDocument() { // 删除文档 client.delete("users-index", "docid"); } } ``` ## 测试数据准备 ```json { "fee": 16 } ``` ## 查询出有一条数据,删除后再查询,数据已不存在 ```json { "query": { "range": { "fee": { "lt": 15 } } } } ``` ## 聚合查询 cardinalityElasticSearch 实现分词全文检索 ```java @Query(index = "sms-logs-index", type = "doc") public class ElasticsearchCount { @QueryParam(name = "query") private String query; @QueryParam(name = "size") private Integer size; @Override public void handle(SearchResponse searchResponse, QueryContext queryContext, Request request) throws IOException { // 打印结果 System.out.println("查询结果:" + searchResponse.getTotalHits()); } } ``` ## 经纬度查询ElasticSearch 实现分词全文检索 ```java @Query(index = "location-index", type = "doc") public class ElasticsearchLocationQuery { @QueryParam(name = "latitude") private Double latitude; @QueryParam(name = "longitude") private Double longitude; @Override public void handle(SearchResponse searchResponse, QueryContext queryContext, Request request) throws IOException { // 打印结果 System.out.println("查询结果:" + searchResponse.getTotalHits()); } } ``` ## 搜素关键字自动补全(suggest)ElasticSearch 实现分词全文检索 ```java @Query(index = "users-index", type = "doc") public class ElasticsearchSuggestion { @QueryParam(name = "query") private String query; @Override public void handle(SearchResponse searchResponse, QueryContext queryContext, Request request) throws IOException { // 打印结果 System.out.println("查询结果:" + searchResponse.getTotalHits()); } } ```

正文

目录

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

delete-by-query

根据 term、match 等查询方式去删除大量的文档

如果需要删除的内容,是index下的大部分数据,不建议使用,因为去匹配文档时还是一个一个的拿到文档ID,去删除
推荐创建一个全新的index,将保留的文档内容,添加到全新的索引中

# 查询出有一条数据,删除后再查询,数据已不存在
GET /sms-logs-index/_search/
{
  "query": {
    "range": {
      "fee": {
        "lt": 15
      }
    }
  }
}

# delete-by-query
POST /sms-logs-index/_delete_by_query
{
  "query": {
    "range": {
      "fee": {
        "lt": 15
      }
    }
  }
}

Java

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

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

    //2. 指定查询条件 和 SearchRequest 指定Query的方式不一样
    request.setQuery(QueryBuilders.rangeQuery("fee").lt(16));

    //3. 执行删除
    BulkByScrollResponse resp = client.deleteByQuery(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    System.out.println(resp.toString());
}

与ElasticSearch 实现分词全文检索 - delete-by-query相似的内容:

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 实现分词全文检索 - term、terms查询

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

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 查询: 正则查询,通过你编写的正则表达式去匹配内容