全文检索与日志管理 Elasticsearch(上)

news2024/10/7 13:18:47

一、Elasticsearch介绍

1.1 全文检索索引

Elasticsearch是一个全文检索服务器,全文检索是一种非结构化数据的搜索方式。

那么什么是结构化数据和非结构化数据呢?

  • 结构化数据:指具有固定格式固定长度的数据,如数据库中的字段。

  •  非结构化数据:指格式和长度不固定的数据,如电商网站的商品详情,每种商品的详情都是不相同的。

 结构化数据一般存入数据库,使用sql语句即可快速查询。但由于非结构化数据的数据量大且格式不固定,我们需要采用全文检索的方式进行搜索。全文检索通过建立倒排索引加快搜索效率。

1.2 倒排索引

什么是索引?

将数据中的一部分信息提取出来,重新组织成一定的数据结构,我们可以根据该结构进行快速搜索,这样的结构称之为索引。

索引即目录,例如字典会将字的拼音提取出来做成目录,通过目录即可快速找到字的位置。

索引分为正排索引倒排索引

 正排索引(正向索引)

将文档id建立为索引,通过id快速可以快速查找数据。如数据库中的主键就会创建正排索引。

倒排索引(反向索引)

非结构化数据中我们往往会根据关键词查询数据。此时我们将数据中的关键词建立为索引,指向文档数据,这样的索引称为倒排索引。

 创建倒排索引流程

 1.3 Elasticsearch的出现

 多年前,一个刚结婚的名叫Shay的失业开发者,跟着妻子去了伦敦,他的妻子在那里学习厨师。Shay使用全文检索工具——lucene,给他的妻子做一个食谱搜索引擎。

 但Lucene的操作非常复杂,且Lucene是一个单机软件,不支持联网访问。因此 Shay基于Lucene开发了开源项目 Elasticsearch。Elasticsearch本质是一个java语言开发的web项目,我们可以通过RESTful风格的接口访问该项目内部的Lucene,从而让全文搜索变得简单。

从此以后,Elasticsearch成为了Github上最活跃的项目之一, Elastic公司围绕Elasticsearch提供商业服务,并开发新的特性。Elasticsearch将永远开源并对所有人可用。

 1.4 Elasticsearch应用场景

  • 2013年初,GitHub抛弃了Solr,采取Elasticsearch来做PB级的搜索。GitHub使用Elasticsearch搜索20TB 的数据,包括13亿文件和1300亿行代码。
  • 维基百科:以Elasticsearch为基础的核心搜索架构。
  • 百度:百度目前广泛使用Elasticsearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据。目前覆盖百度内部20多个业务线(包括casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据
  • 新浪使用ES分析处理32亿条实时日志。
  • 阿里使用ES构建自己的日志采集和分析体系。
  • 我们可以使用Elasticsearch实现全站搜索,线上商城系统的搜索,分析日志等功能。

 1.5 Elasticsearch数据结构

文档(Document):文档是可被查询的最小数据单元,一个 Document 就是一条数据。类似于关系型数据库中的记录的概念。

类型(Type):具有一组共同字段的文档定义成一个类型,类似于关系型数据库中的数据表的概念。

索引(Index):索引是多种类型文档的集合,类似于关系型数据库中的库的概念。

域(Fied):文档由多个域组成,类似于关系型数据库中的字段的概念。

Elasticsearch跟关系型数据库中概念的对比:

JAVA项目实体类对象属性
ESIndexTypeDocumentFiled
MysqlDatabaseTableRowColumn

注:ES7.X之后删除了type的概念,一个索引不会代表一个库,而是代表一张表。所以目前的ES中概念对比为 

JAVA项目实体类对象属性
ES无此概念IndexDocumentFiled
MysqlDatabaseTableRowColumn

二、Elasticsearch安装

2.1 Linux安装ES服务 

准备工作

1.准备一台搭载有CentOS7系统的虚拟机,使用XShell连接虚拟机

2.关闭防火墙,方便访问ES

#关闭防火墙:
systemctl stop firewalld.service

#禁止防火墙自启动:
systemctl disable firewalld.service

 3.配置最大可创建文件数大小,因为在安装ES的时候会创建大量的文件,但是linux系统对创建文件的数量是有限制的。

#打开系统文件:
vim /etc/sysctl.conf


#添加以下配置:
vm.max_map_count=655360


#配置生效:
sysctl -p

4.由于ES不能以root用户运行,我们需要创建一个非root用户,此处创建一个名为es的用户:

#创建用户:
useradd es

安装服务

1.使用xftp将linux版的ES上传至虚拟机

2.解压ES

#解压:
tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz


#重命名:
mv elasticsearch-7.17.0 elasticsearch1


#移动文件夹:
mv elasticsearch1 /usr/local/


#es用户取得该文件夹权限:
chown -R es:es /usr/local/elasticsearch1

3.启动ES服务

#切换为es用户:
su es


#进入ES安装文件夹:
cd /usr/local/elasticsearch1/bin/


#启动ES服务:
./elasticsearch


#查询ES服务是否启动成功
curl 127.0.0.1:9200

 2.2 安装kibana

 Kibana是一款开源的数据分析和可视化平台,设计用于和Elasticsearch协作。我们可以使用Kibana对Elasticsearch索引中的数据进行搜索、查看、交互操作。

1.使用xftp工具将Kibana压缩文件上传到Linux虚拟机

注意,Kibana的版本一定要和Elasticsearch的版本一致。

 2.解压到usr/local下

tar -zxvf kibana-7.17.0-linux-x86_64.tar.gz -C /usr/local/

3.修改配置

# 进入Kibana解压路径
cd /usr/local/kibana-7.17.0-linux-x86_64/config


# 修改配置文件
vim kibana.yml


# 加入以下内容
# kibana主机IP
server.host: "虚拟机IP"
# Elasticsearch路径
elasticsearch.hosts: ["http://127.0.0.1:9200"]

4.启动:

kibana也不能以root用户运行,我们给es用户设置kibana目录的权限,并使用es用户运行kibana

# 给es用户设置kibana目录权限
chown -R es:es /usr/local/kibana-7.17.0-linux-x86_64/


# 切换为es用户
su es


# 启动kibana
cd /usr/local/kibana-7.17.0-linux-x86_64/bin/
./kibana

需要注意的是,不要忘了启动es,可以开两个窗口,一个启动es另一个启动kibana 

5.访问kibana:http://192.168.66.100:5601

6.点击Management =>Stack Management=> Index Management可以查看es索引信息。

2.3 Docker安装ES和Kibana

安装Elasticsearch

1.在Centos7中安装docker

# 安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun


# 启动docker
systemctl start docker

2.拉取ES镜像

docker pull elasticsearch:7.17.0

3.启动容器

# docker容器间建立通信
docker network create elastic


# 创建es容器
docker run --restart=always -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --name='elasticsearch' --net elastic --cpuset-cpus="1" -m 1G -d elasticsearch:7.17.0

参数:

run :运行容器

--restart=always:开机自动启动

-p 9200:9200 -p 9300:9300:外部端口是9200,内部端口是9300

-e "discovery.type=single-node":单节点模式

-e ES_JAVA_OPTS="-Xms512m -Xmx512m":java环境运行占用的最大内存空间是512m

--name:容器的名字

--net elastic:使用的网关是elastic

--cpuset-cpus="1" -m 1G:使用1个cpu占用1G内存

-d elasticsearch:7.17.0:容器使用的镜像叫elasticsearch:7.17.0

安装Kibana 

1.拉取镜像

docker pull kibana:7.17.0

2.启动容器

docker run --name kibana --net elastic --link elasticsearch:elasticsearch -p 5601:5601 -d kibana:7.17.0

三、Elasticsearch常用操作

Elasticsearch是使用RESTful风格的http请求访问操作的,请求参数和返回值都是Json格式的,我们可以使用kibana发送http请求操作ES。 

3.1 索引操作

创建无结构的索引

路径:ip地址:端口号/索引名

注:在kibana中所有的请求都会省略ip地址:端口号,之后的路径我们省略写ip地址:端口号。创建索引相当于是创建一张表。

在kibana中创建一个索引/student,Management—>DevTools

查看刚刚创建的索引,Management—>StackManagement—>IndexManagement

 创建有结构的索引

POST /索引名/_mapping
{
    "properties":{
        "域名1":{
            "type":域的类型,
            "store":是否存储,
            "index":是否创建索引,
      "analyzer":分词器
       },
       "域名2":{ 
            ...
        }
    }
}

这里的域相当于是表中的字段/属性。 

也可以在创建索引的时候直接为索引添加结构

PUT /索引名
{
  "mappings":{
    "properties":{
      "域名1":{
        "type":域的类型,
        "store":是否单独存储,
        "index":是否创建索引,
             "analyzer":分词器
       },
      "域名2":{ 
        ...
       }
     }
   }
}

 删除索引

DELETE /索引名

3.2 文档操作

文档操作就是为索引添加、删除、修改、查询内容 

 新增/修改文档

POST /索引/_doc/[id值]
{
    "field名":field值
}

注:id值不写时自动生成文档id,id和已有id重复时修改文档。这个id相当于是文档的主键,而域则是文档的属性。

POST /student/_doc/1
{
  "id":1,
   "name":"zj",
   "age":10
}

根据id查询文档

GET /索引/_doc/id值

例如,查询student索引中1的数据:

GET /student/_doc/1

注:查询的数据也是json格式的。

删除文档 

DELETE /索引/_doc/id值

根据文档id批量查询某个索引的文档

GET /索引/_mget
{
  "docs":[
     {"_id":id值},
     {"_id":id值}
   ] 
}

例如,查询student索引中id为1和id为2的索引

GET /student/_mget
{
  "docs":[
     {"_id":1},
     {"_id":2}
   ] 
}

查询索引中所有文档

相当于是MySQL中的记录。

GET /索引/_search
{
   "query": {
     "match_all": {}
   }
}

例如,查询student索引中的全部文档

GET /student/_search
{
   "query": {
     "match_all": {}
   }
}

修改文档部分字段

POST /索引/_doc/id值/_update
{ 
  "doc":{ 
    域名:值
    } 
}

例如,修改文档id为1的记录的id和age属性

POST /student/_doc/1/_update
{ 
  "doc":{ 
    "id":123,
    "age":100
    } 
}

注:

Elasticsearch执行删除操作时,ES先标记文档为deleted状态,而不是直接物理删除。当ES存储空间不足或工作空闲时,才会执行物理删除操作。

Elasticsearch执行修改操作时,ES不会真的修改Document中的数据,而是标记ES中原有的文档为deleted状态,再创建一个新的文档来存储数据。

3.3 域的属性

index属性

该域是否创建倒排索引。只有值设置为true,才能根据该域的关键词查询文档。

// 根据关键词查询文档
GET /索引名/_search
{
    "query":{
    "term":{ 
            搜索字段: 关键字
        } 
   }
}

演示

#创建索引student1,设置index为true
PUT /student1
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "index": true
      }
    }
  }
}


#创建索引student2,设置index为false
PUT /student2
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "index": false
      }
    }
  }
}


#为student1索引添加一条文档
POST /student1/_doc/1
{
  "name":"HELLO ES"
}

#为student2索引添加一条文档
POST /student2/_doc/1
{
  "name":"HELLO ES"
}

#根据关键字查询数据
GET /student1/_search
{
    "query":{
    "term":{ 
            "name":"HELLO"
        } 
   }
}


GET /student2/_search
{
    "query":{
    "term":{ 
            "name":"HELLO"
        } 
   }
}

发现。建立索引的student1 能通过关键字搜索到,但是没有建立索引的student2不能通过关键字查询到。

type属性

域的类型

核心类型具体类型
字符串类型text
整数类型long, integer, short, byte
浮点类型double, float
日期类型date
布尔类型boolean
数组类型array
对象类型object
不分词的字符串keyword

不分词的字符串和字符串类型的区别是:字符串类型是能分词的,就是能将该字符串分为多个部分来检索,但是不分词的字符串不能拆分,只能作为一个整体来检索。

store域的属性

是否单独存储。如果设置为true,则该域能够单独查询出来,没有其他域的影响。

// 单独查询某个域:
GET /索引名/_search
{
 "stored_fields": ["域名"]
}

演示

#创建索引student1,store设置为true
PUT /student1
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "index": true,
        "store": true
      },
      "age":{
        "type": "integer"
      }
    }
  }
}


#创建索引student2,store设置为false
PUT /student2
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "index": true,
        "store": false
      },
      "age":{
        "type": "integer"
      }
    }
  }
}


#为student1索引添加一条文档
POST /student1/_doc/1
{
  "name":"HELLO ES",
  "age":10
}

#为student2索引添加一条文档
POST /student2/_doc/1
{
  "name":"HELLO ES",
  "age":20
}

# 单独查询student1某个域:
GET /student1/_search
{
 "stored_fields": ["name"]
}

# 单独查询student2某个域:
GET /student2/_search
{
 "stored_fields": ["name"]
}

四、分词器

4.1 默认分词器 

 ES文档的数据拆分成一个个有完整含义的关键词,并将关键词与文档对应,这样就可以通过关键词查询文档。要想正确的分词,需要选择合适的分词器。

standard :Elasticsearch默认分词器,根据空格和标点符号对英文进行分词,会进行单词的大小写转换。

默认分词器是英文分词器,对中文的分词是一字一词。也就是说对中文的支持不好

GET /_analyze
{
    "text":测试语句, 
    "analyzer":分词器
}

实例

4.2 IK分词器

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。提供了两种分词算法:

  • ik_smart:最少切分

  • ik_max_word:最细粒度划分

安装IK分词器

1.关闭es服务

#查找es进程
ps -ef | grep elastic

#杀死进程
kill -9 PID

2.使用文件上传工具将ik分词器上传至虚拟机

注:ik分词器的版本要和es版本保持一致。

 3.解压ik分词器到elasticsearch的plugins目录下

unzip elasticsearch-analysis-ik-7.17.0.zip -d /usr/local/elasticsearch1/plugins/analysis-ik

4.启动ES服务

su es


#进入ES安装文件夹:
cd /usr/local/elasticsearch1/bin/


#启动ES服务:
./elasticsearch -d

测试分词器效果

GET /_analyze
{
    "text":"测试语句", 
    "analyzer":"ik_smart/ik_max_word"
}

IK分词器词典

IK分词器根据词典进行分词,词典文件在IK分词器的config目录中。

  • main.dic:IK中内置的词典。记录了IK统计的所有中文单词。

  • IKAnalyzer.cfg.xml:用于配置自定义词库。

/usr/local/elasticsearch1/plugins/analysis-ik/config
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">ext_dict.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">ext_stopwords.dic</entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

注,配置完成后需要重新启动es和kibana。

4.3 拼音分词器

拼音分词器可以将中文分成对应的全拼,全拼首字母等。

安装拼音分词器

1.关闭es服务

#查找es进程
ps -ef | grep elastic

#杀死进程
kill -9 PID

2.使用文件上传工具将拼音分词器上传至虚拟机

注:拼音分词器的版本要和es版本保持一致。

3.解压拼音分词器到elasticsearch的plugins目录下

unzip elasticsearch-analysis-pinyin-7.17.0.zip -d /usr/local/elasticsearch1/plugins/analysis-pinyin

4.启动ES服务

su es


#进入ES安装文件夹:
cd /usr/local/elasticsearch1/bin/


#启动ES服务:
./elasticsearch

测试分词效果

4.4 自定义分词器

 真实开发中我们往往需要对一段内容既进行文字分词,又进行拼音分词,此时我们需要自定义ik+pinyin分词器。

 创建自定义分词器

1.在创建索引时自定义分词器

PUT /索引名
{
  "settings" : {
    "analysis" : {
      "analyzer" : {
        "ik_pinyin" : { //自定义分词器名
          "tokenizer":"ik_max_word", // 基本分词器
          "filter":"pinyin_filter" // 配置分词器过滤
         }
       },
      "filter" : { // 分词器过滤时配置另一个分词器,相当于同时使用两个分词器
        "pinyin_filter" : { 
          "type" : "pinyin", // 另一个分词器
          // 拼音分词器的配置
          "keep_separate_first_letter" : false, // 是否分词每个字的首字母
          "keep_full_pinyin" : true, // 是否分词全拼
          "keep_original" : true, // 是否保留原始输入
          "remove_duplicated_term" : true // 是否删除重复项
         }
       }
     }
   },
  "mappings":{
    "properties":{
      "域名1":{
        "type":域的类型,
        "store":是否单独存储,
        "index":是否创建索引,
        "analyzer":分词器
       },
      "域名2":{ 
        ...
       }
     }
   }
}

测试自定义分词器

GET /索引/_analyze
{
 "text": "你好ES",
 "analyzer": "ik_pinyin"
}

五、Elasticsearch搜索文档

5.1 准备工作 

 Elasticsearch提供了全面的文档搜索方式,在学习前我们添加一些文档数据

#创建索引
PUT /students
{
  "mappings": {
    "properties": {
      "id": {
        "type": "integer",
        "index": true
      },
      "name": {
        "type": "text",
        "store": true,
        "index": true,
        "analyzer": "ik_smart"
      },
      "info": {
        "type": "text",
        "store": true,
        "index": true,
        "analyzer": "ik_smart"
      }
    }
  }
}


#为索引添加数据
POST /students/_doc/
{
 "id":1,
 "name":"Java",
 "info":"I love Java"
}

POST /students/_doc/
{
 "id":2,
 "name":"美羊羊",
 "info":"美羊羊是羊村最漂亮的人"
}

POST /students/_doc/
{
 "id":3,
 "name":"懒羊羊",
 "info":"懒羊羊的成绩不是很好"
}

POST /students/_doc/
{
 "id":4,
 "name":"小灰灰",
 "info":"小灰灰的年纪比较小"
}

POST /students/_doc/
{
 "id":5,
 "name":"沸羊羊",
 "info":"沸羊羊喜欢美羊羊"
}

POST /students/_doc/
{
 "id":6,
 "name":"灰太狼",
 "info":"灰太狼是小灰灰的父亲,每次都会说我一定会回来的"
}

搜索文档

GET /索引/_search
{
    "query":{
    搜索方式:搜索参数
   }
}

5.2 搜索方式

match_all:查询所有文档

#查询全部文档
GET /students/_search
{
  "query": {
    "match_all": {}
  }
}

match:全文检索。将查询条件分词后再进行搜索。

格式

{
    "query":{
    "match":{
      搜索字段(域):搜索条件
     }
   }
}

实例

#查询info域中带🐏的文档
GET /students/_search
{
  "query": {
    "match": {
      "info": "羊"
    }
  }
}

注:在搜索时关键词有可能会输入错误,ES搜索提供了自动纠错功能,即ES的模糊查询。使用match方式可以实现模糊查询。模糊查询对中文的支持效果一般,我们使用英文数据测试模糊查询。

格式

{
    "query": {
        "match": {
            "域名": {
            "query": 搜索条件,
            "fuzziness": 最多错误字符数,不能超过2
            }
        }
    }
}

实例

GET /students/_search
{
  "query": {
    "match": {
      "info": {
        "query": "lova",
        "fuzziness": 1
      }
    }
  }
}

range:范围搜索。对数字类型的字段进行范围搜索

格式

{
    "query":{
    "range":{
      搜索字段:{ 
        "gte":最小值,
        "lte":最大值
       } 
     }
   }
}
gt/lt:大于/小于
gte/lte:大于等于/小于等于

实例

#查询id从1到3的文档
GET /students/_search
{
  "query": {
    "range": {
      "id": {
        "gte": 1,
        "lte": 3
      }
    }
  }
}

match_phrase:短语检索。搜索条件不做任何分词解析,在搜索字段对应的倒排索引中精确匹配。

格式

{
    "query":{
    "match_phrase":{
      搜索字段:搜索条件
     }
   }
}

实例

#查询info域是"I love Java"的文档
GET /students/_search
{
  "query": {
    "match_phrase": {
      "info": "I love Java"
    }
  }
}

term/terms:单词/词组搜索。搜索条件不做任何分词解析,在搜索字段对应的倒排索引中精确匹配

格式

{
    "query":{
    "term":{ 
            搜索字段: 搜索条件
     }
   }
}


{
    "query":{
    "terms":{ 
            搜索字段: [搜索条件1,搜索条件2]
     }
   }
}

实例

GET /students/_search
{
  "query": {
     "term": {
       "info": {
         "value": "成绩"
       }
     }
  }
}


GET /students/_search
{
  "query": {
    "terms": {
      "info": [
        "成绩",
        "羊羊"
      ]
    }
  }
}

5.3 复合搜索 

 格式

GET /索引/_search
{ 
    "query": { 
    "bool": { 
      // 必须满足的条件 类似sql中的and
      "must": [ 
                搜索方式:搜索参数,
                搜索方式:搜索参数
       ],
      // 多个条件有任意一个满足即可类似or
      "should": [
                搜索方式:搜索参数,
                搜索方式:搜索参数
           ],
            // 必须不满足的条件
           "must_not":[
               搜索方式:搜索参数,
               搜索方式:搜索参数
           ]
       } 
   } 
}

 实例

#查询info域中没有成绩的和id范围不在1-3之间的文档
GET /students/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "info": {
              "value": "成绩"
            }
          }
        },
        {
          "range": {
            "id": {
              "gte": 1,
              "lte": 3
            }
          }
        }
        
      ]
    }
  }
}

5.4 结果排序

 ES中默认使用相关度分数实现排序,当然不想使用默认的排序方法可以通过搜索语法定制化排序。

格式

GET /索引/_search
{ 
  "query": 搜索条件,
  "sort": [
       {
           "字段1":{
               "order":"asc"
           } 
       },
       { 
           "字段2":{ 
               "order":"desc" 
           } 
       }
   ] 
}

示例

#查询info域是"成绩"的文档,按照id降序排序
GET /students/_search
{
  "query": {
    "match": {
      "info": "成绩"
    }
  },
  "sort": [
    {
      "id": {
        "order": "desc"
      }
    }
  ]
}

由于ES对text类型字段数据会做分词处理,使用哪一个单词做排序都是不合理的,所以 ES中默认不允许对text类型的字段做排序。如果需要使用字符串做结果排序,可以使用 keyword类型的字段作为排序依据,因为keyword字段不做分词处理。

5.5 分页查询

 格式

GET /索引/_search
{ 
    "query": 搜索条件,
    "from": 起始下标,
    "size": 查询记录数
}

示例

#查询info域是"成绩"的文档,并且查询第一页的1条数据
GET /students/_search
{
  "query": {
    "match": {
      "info": "成绩"
    }
  },
   "from": 0,
   "size": 1
}

5.6 高亮查询

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。

我们可以在关键字左右加入标签字符串,数据传入前端即可完成高亮显示,ES可以对查询出的内容中关键字部分进行标签和样式的设置。

格式

GET /索引/_search
{ 
    "query":搜索条件,
    "highlight":{
        "fields": { 
         "高亮显示的字段名": {
        // 返回高亮数据的最大长度
             "fragment_size":100,
                // 返回结果最多可以包含几段不连续的文字
             "number_of_fragments":5
         } 
     },
    "pre_tags":["前缀"], 
    "post_tags":["后缀"]
   } 
}

示例

GET /students/_search
{
  "query": {
    "match": {
      "info": "羊"
    }
  },
  "highlight": {
    "fields": {
      "info": {
        "fragment_size": 20,
        "number_of_fragments": 5
      }
    }
  }
}

5.7 SQL查询

在ES7之后,支持SQL语句查询文档

GET /_sql?format=txt
{
    "query": SQL语句
}

开源版本的ES并不支持通过Java操作SQL进行查询,如果需要操作 SQL查询,则需要氪金(购买白金版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RH850/U2A】:DMA开发笔记

DMA开发笔记 项目背景参考文档DMA开发过程开发过程中的问题汇总框图预览设计思路重点注意DMA的功能安全属性串口的DMA请求信号模式选择配置DMA的中断如果我们买了第三方的模块(比如LIN/UART)它是自带DMA配置开启功能;奈何,我们没有购买第三方模块所以需要我们参考datasheet…

Python Opencv实践 - 图像放射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(img.shape[:2])#使用getAffineTransform来获得仿射变换的矩阵M #cv.getAffineTransform(…

(白帽黑客)大厂面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

Django之定时任务--apscheduler

Django--定时任务apscheduler的使用 apscheduler定时任务的使用1、安装包2、配置settings.py3、在manage.py的文件同级目录下创建文件scheduler.py4、在项目的urls.py中调用这个定时计划5、然后启动项目 python manage.py runserver,在admin中查看就能看到你的定时任务及执行的…

LeetCode刷题——617. 合并二叉树

617. 合并二叉树 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两…

嵌入式:ARM Day1

1. 思维导图 2.作业一 3.作业2

selenium自动化测试之搭建测试环境

自动化测试环境&#xff1a; Python3.7Selenium3.141谷歌浏览器76.0/火狐浏览器 1、安装Python并配置环境变量。 下载并安装&#xff1a;配置环境变量&#xff1a;C:\Python37;C:\Python37\Scripts; 2、安装Pycharm开发工具。 下载地址&#xff1a; 注意下载&#xff1a;Co…

stm32项目(10)——基于stm32的盲人监护系统

一.实现的功能 本次设计的盲人监护系统&#xff0c;旨在为盲人的外出提供保护。主要功能如下&#xff1a; 超声波测距模块检测前方障碍物&#xff0c;当前方有障碍物时&#xff0c;语音模块报警提示“前方有障碍物&#xff0c;请绕道”&#xff0c;盲人在听到这条语音后就知…

一篇文章搞懂图像的本质是什么

图像是什么&#xff1f; 每个图⽚可以看成数组 彩⾊图⽚呢&#xff1f; #pic_center 500x500 计算机眼⾥的颜⾊图⽚ Numpy读取彩⾊照⽚ • Shape 三维数组 • ⾼度 • 宽度 • 颜⾊通道 Numpy读取彩⾊照⽚ • 照⽚⼤⼩ 540 x 480 • 540个像素宽度 • 480个像素⾼度 • 3个颜…

[NDK]从Opengles到Vulkan-基础篇(2)-运行配置

上一篇我们介绍了Opengl和Vulkan运行环境的不同。 引入Opengles,我们需要做的是,在Cmakes中配置动态库引入。 使用opengles2就用GLESv2,用es3就用GLESv3,而EGL需要使用配置EGL环境 这里两个比较基础的东西是EGL和GLES的库引入。 es2只要Android 4.0就开始支持,es3是4.4开…

【2023最新版】APP测试面试题(超详细~)

一、web测试和app测试的相同点和区别&#xff1f; 相同点&#xff1a;都离不开测试的基础知识和测试原理。具体包括以下几个方面。 测试用例&#xff0c;均使用边界值分析法&#xff0c;等价类划分法等。多数采用黑盒测试&#xff0c;来验证业务功能是否能得到正确的应用。 需…

外贸出货中惹了个大麻烦

谈C端的客户与B端的客户相比&#xff0c; 我觉得最大的好处就是不用我们自己去报关&#xff0c;一般C端的客户都会有自己的货代负责双清业务&#xff0c;即使我们自己去发货&#xff0c; 也是会找双清的货代&#xff0c;因此我们自己本身就不要报关报检&#xff0c; 只需要将货…

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;ku…

Web菜鸟教程 - Radis实现高性能数据库

Redis是用C语言开发的一个高性能键值对数据库&#xff0c;可用于数据缓存&#xff0c;主要用于处理大量数据的高访问负载。 也就是说&#xff0c;如果你对性能要求不高&#xff0c;不用Radis也是可以的。不过作为最自己写的程序有高要求的程序员&#xff0c;自然是要学一下的&a…

adb对安卓app进行抓包(ip连接设备)

adb对安卓app进行抓包&#xff08;ip连接设备&#xff09; 一&#xff0c;首先将安卓设备的开发者模式打开&#xff0c;提示允许adb调试 二&#xff0c;自己的笔记本要和安卓设备在同一个网段下&#xff08;同连一个WiFi就可以了&#xff09; 三&#xff0c;在笔记本上根据i…

RunnerGo的相比较JMeter优势,能不能替代?

目前在性能测试领域市场jmeter占有率是非常高的&#xff0c;主要原因是相对比其他性能测试工具使用更简单&#xff08;开源、易扩展&#xff09;&#xff0c;功能更强大&#xff08;满足多种协议的接口&#xff09;&#xff0c;但是随着研发协同的升级&#xff0c;平台化的性能…

手机出现 不读卡 / 无信号时应该怎么办?

当手机屏幕亮起&#xff0c;一般在屏幕最上方都会有代表手机卡状态的显示&#xff0c;其中网络信号和读卡状态的标识&#xff0c;依旧有很多人分不太清&#xff0c;更不清楚改怎么办了。 1、当我们的手机里有两张卡时&#xff0c;则会有两个信号显示 2、信号状态一般是由短到…

淘宝商品数据接口 淘宝商品价格接口 淘宝商品sku抓取

基础介绍 1&#xff09;淘宝商品id&#xff0c;它均由数字构成&#xff0c;且如同身份证号码一样具有唯一性&#xff0c;属于商品链接中的一部分。在淘宝页面可以以下方式查看。 直接打开商品的详情页面&#xff0c;看到浏览器地址栏中的宝贝链接&#xff0c;链接中找到“id”&…

Android Jetpack Compose 中的分页与缓存展示

Android Jetpack Compose 中的分页与缓存展示 在几乎任何类型的移动项目中&#xff0c;移动开发人员在某个时候都会处理分页数据。如果数据列表太大&#xff0c;无法一次从服务器检索完毕&#xff0c;这就是必需的。因此&#xff0c;我们的后端同事为我们提供了一个端点&#…

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-BP遗…