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

elasticsearch,实现,分词,全文检索,restful,基本操作 · 浏览次数 : 196

小编点评

**ElasticSearch 实现分词全文检索** **简介** ElasticSearch 是一个用于搜索和分析文本的开源搜索引擎。它可以用于创建和管理索引,并使用各种搜索操作来检索文本。 **分词** 分词是将文本转换为一系列关键字的过程。ElasticSearch 使用不同的分词器来实现分词。默认情况下,ElasticSearch 使用的是 IK 分词器,它可以处理大多数常见的语言中常见的分词语。 **实现** 1. **创建索引** ```json PUT /person{ "settings": { "number_of_shards": 5, "number_of_replicas": 1 }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "ik_max_word", "index": true, "store": false }, "author": { "type": "keyword" }, "count": { "type": "long" }, "on-sale": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" }, "descr": { "type": "text" } } } } ``` 2. **添加文档** ```json POST /book/_doc{ "name": "太极拳", "author": "陈王廷", "count": 666, "on-sale": "2023-02-23", "descr": "掤、捋、挤、按、采、列、肘、靠" } ``` **修改文档** ```json PUT /book/_doc/1/_update{ "doc": { "name": "太极拳", "author": "陈王廷", "count": 666, "on-sale": "2023-02-28", "descr": "掤、捋、挤、按、采、列、肘、靠" } } ``` **删除文档** ```json DELETE /book/_doc/YJJLfYYBGlLaT58LDoV5 ``` **总结** 分词是使用 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 附源码

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/_update: 修改文档,在请求体中指定ison字符串代表修改的具体信息

PUT 请求:

http://ip;port/index: 创建一个索引,需要在请求体中指定索引的信息,类型,结构
http://ip:port/index/type/_mappings: 代表创建索引时,指定索引文档存储的属性的信息

DELETE 请求:

http://ip;port/index: 删除跑路
http://ip;port/index/type/doc_id: 删除指定的文档

操作

创建一个索引

Kibana 操作
创建 person 索引

# 创建一个索引
PUT /person
{
  "settings": {
    "number_of_shards": 5, #分片数
    "number_of_replicas": 1 #备份数
  }
}

返回值

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "person"
}

Kibana 中查看

Stack Management -> 索引管理

image
image
单机版,分片无法存放,所以 yellow 黄色

查看索引信息

# 查看索引信息
GET /person

image

删除索引信息

# 删除索引
DELETE /person

Kibana 操作
image

Field datatypes

String:
 text: 一般用于全文检索。将当前的Field进行分词
 keyword: 当前 Field 不会被分词 
数值类型:
 long、 integer、 short、 byte、 double、 float、
 half_float:精度比float小一半
 scaled_float:根据一个long和scaled来表达一个浮点型, long=345,scaled=100 => 3.45
时间类型:
 date:针对时间类型指定具体格式
布尔类型:
 boolean:表达true和false
二进制类型:
 binary:暂时支持Base64 encode string
范围类型(Range datatypes):
 long_range: 赋值时,无序指定具体的内容,只需要存储一个范围即可,指定gt,此,gte,lte
 integer_range:同上
 double_range:同上
 float_range: 同上
 date_range:同上
 ip_range: 同上。
经纬度类型:
 geo_point: 用来存储经纬度,结合定位的经纬度,来计算出距离
IP类型
 ip: 可以存付IPV4、IPV6

其它类型参考官网:

创建索引并指定结构

## 创建索引并指定结构
PUT /book
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    // 文档存储的Field
    "properties":{
      "name":{
        // 类型
        "type":"text",
        // 指定分词器
        "analyzer":"ik_max_word",
        // 指定当前Field可以被作为查询的条件
        "index":true,
        // 是否需要额外存储
        "store":false
      },
      "author":{
        "type":"keyword"
      },
      "count":{
        "type":"long"
      },
      "on-sale":{
        "type":"date",
        // 时间类型时格式化方式
        "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      },
      "descr":{
        "type":"text",
        "analyzer":"ik_max_word"
      }
    }
  }
}

image

文档操作

文档在ES服务中的唯一标识,_index, _type, _id 三个内容为组合,锁定一个文档进行操作

新建文档

自动生成 _id

ID不方便使用

# 添加文档,自动生成 id
POST /book/_doc
{
  "name":"太极",
  "author":"伏羲",
  "count":888,
  "on-sale":"2023-02-23",
  "descr":"太极生两仪,两仪生四象,四象生八卦"
}

返回

{
  "_index" : "book",
  "_type" : "_doc", //创建时没指定,默认的
  "_id" : "YJJLfYYBGlLaT58LDoV5",  // 自动生成的ID
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

手动创建ID

POST /book/_doc/1
{
  "name":"太极拳",
  "author":"陈王廷",
  "count":666,
  "on-sale":"2023-02-23",
  "descr":"掤、捋、挤、按、采、列、肘、靠"
}

返回值

{
  "_index" : "book",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

修改文档

覆盖式修改

PUT /book/_doc/1
{
  "name":"太极拳",
  "author":"陈王廷",
  "count":666, //如果不赋值,原来的值将被更新成 0
  "on-sale":"2023-02-28",
  "descr":"掤、捋、挤、按、采、列、肘、靠"
}

doc 修改方式

Deprecation: [types removal] Specifying types in document update requests is deprecated, use the endpoint /{index}/_update/{id} instead.

POST /book/_doc/1/_update
{
  "doc":{
    // 指定Field单独修改
    "count":6666
  }  
}

返回值

#! Deprecation: [types removal] Specifying types in document update requests is deprecated, use the endpoint /{index}/_update/{id} instead.
{
  "_index" : "book",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}

删除文档

DELETE /book/_doc/YJJLfYYBGlLaT58LDoV5

查看数据

image
image
image
image
image
image

与ElasticSearch 实现分词全文检索 - Restful基本操作相似的内容:

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 实现分词全文检索 - 高亮查询

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

ElasticSearch 实现分词全文检索 - 聚合查询 cardinality

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

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 实现分词全文检索 - 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