时间:2023-05-30 12:12:01 | 来源:网站运营
时间:2023-05-30 12:12:01 来源:网站运营
ES从入门到实战:分词
:将整句分拆为单词保存的记录
检索
: 1)、红海特工行动? 2)、红海行动?docker pull elasticsearch:7.4.2 # 存储和检索数据
docker pull kibana:7.4.2 # 可视化检索数据
注意:elasticsearch 要和 kibana 的版本保持一致!
mkdir -p /mydata/elasticsearch/config # 在mydata文件夹下创建es的config文件夹,将docker中es的配置挂载在外部,当我们在linux虚拟机中修改es的配置文件时,就会同时修改docker中的es的配置mkdir -p /mydata/elasticsearch/data #在mydata文件夹下创建es的data文件夹echo "http.host:0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml # [http.host:0.0.0.0]允许任何远程机器访问es,并将其写入es的配置文件中chmod -R 777 /mydata/elasticsearch/ # 保证权限问题
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 /-e "discovery.type=single-node" /-e ES_JAVA_OPTS="-Xms64m -Xmx128m" /-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml /-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data /-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins /-d elasticsearch:7.4.2# docker run --name elasticsearch 创建一个es容器并起一个名字;# -p 9200:9200 将linux的9200端口映射到docker容器的9200端口,用来给es发送http请求# -p 9300:9300 9300是es在分布式集群状态下节点之间的通信端口 / 换行符# -e 指定一个参数,当前es以单节点模式运行# *注意,ES_JAVA_OPTS非常重要,指定开发时es运行时的最小和最大内存占用为64M和128M,否则就会占用全部可用内存# -v 挂载命令,将虚拟机中的路径和docker中的路径进行关联# -d 后台启动服务
安装完 elasticsearch 后我们来启动一下,会发现使用docker ps
命令查看启动的容器时没有找到我们的 es,这是因为目前 es 的配置文件的权限导致的,因此我们还需要修改一下 es 的配置文件的权限:docker start elasticsearch
再次启动 es,使用docker ps
命令查看后发现容器还是没有启动,这是问什么呢? 我们使用docker logs elasticsearch
看一下 es 的启动日志:elasticsearch.yml
文件的时候k-v键值对配置错误导致的,查看 yml 文件会发现我配置的内容是这样的:http.host:0.0.0.0
而实际上k-v键值对之间应该有空格,注意 yml 配置文件中key: value格式冒号
后面要跟一个空格
。否则就会导致上面的错误。 因此需要修改一下elasticsearch.yml
文件,修改为:http.host: 0.0.0.0
修改并保存之后再次使用docker start elasticsearch
启动 es,使用docker ps
命令产看后可以看到我的 es 容器已经启动起来了:http://124.220.176.158:9200/
,可以看到 es 启动成功后返回类似下面的数据:注意124.220.176.158 是我的linux虚拟机的地址,读者需要根据自己的虚拟机地址来进行访问
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://124.220.176.158:9200 -p 5601:5601 /-d kibana:7.4.2
安装完成后在浏览器地址栏访问http://
124.220.176.158:5601/
,可以看到 kibana 已经启动成功:使用 postman 或者在浏览器地址栏输入请求路径http://
124.220.176.158:9200/_cat/xxx
show databases
;索引
的哪个类型
下,指定用哪个唯一标识PUT customer/external/1
; 在 customer 索引下的 external 类型下保存 1 号数据为PUT customer/external/1 |
---|
PUT
和POST
都可以;POST
新增。如果不指定id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号;PUT
可以新增也可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改http://192.168.56.10:9200/customer/external/
请求,注意没有带 id,使用的还是上面 put 方法中的参数, 可以看到创建记录成功,es 帮我们生成了一个id:GET customer/external/1
?if_seq_no=0&if_primary_term=1
字段; 我们在 postman 中使用 put 方法发送 http://192.168.56.10:9200/customer/external/1?if_seq_no=0&if_primary_term=1
请求,参数传_update
的 post 请求更新数据,在 postman 中使用 post 方法发送http://192.168.56.10:9200/customer/external/1/_update
请求,参数传:_version
、_seq_no
也不会变:http://192.168.56.10:9200/customer/external/1
请求,可以看到以下结果,可以看到删除文档成功:not_found
结果:http://192.168.56.10:9200/customer
请求,可以看到以下结果,可以看到删除索引成功:no such index [customer]
的 404 状态的结果:POST /_bulk{"delete":{"_index":"website","_type":"blog","_id":"123"}}{"create":{"_index":"website","_type":"blog","_id":"123"}}{"title":"My first blog post"}{"index":{"_index":"website","_type":"blog"}}{"title":"My second blog post"}{"update":{"_index":"website","_type":"blog","_id":"123"}}{"doc":{"title":"My updated blog post"}}
上面直接使用了/_bulk
,没有指定具体的索引,表示在 ES 全局执行。执行结果如下:action
(动作) 。 如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。 当 bulk API 返回时,它将提供每个动作的状态(与发送的顺序相同) ,所以你可以检查是否一个指定的动作是不是失败了。POST bank/account/_bulk
:REST request URI
发送搜索参数(uri+检索参数
)REST requestbody
来发送它们(uri+请求体
)uri+检索参数
:uri+请求体 进行检索
:GET /example/_search{ "query": { "match_all": {} }, "sort": [ { "id": "asc" } ]}
1)、基本语法格式{ QUERY_NAME:{ ARGUMENT: VALUE, ARGUMENT: VALUE, ... }}
例如:{ QUERY_NAME:{ FIELD_NAME:{ ARGUMENT: VALUE, ARGUMENT: VALUE, ... } }}
例如:GET /bank/_search{ "query": { "match_all": {} }, "sort": [ { "balance": { "order": "desc" } } ], "from": 0, "size": 5}
- query 定义如何查询;GET /example/_search{ "query": { "match_all": {} }, "sort": [ { "id": "asc" } ], "from": 0, "size": 5,"_source": ["name","counter"] }
只返回_source
中指定的字段,类似于 MySQL 中的select field_1,field_2,... from table
GET /example/_search{ "query": { "match": { "id": 1 } }}
GET /example/_search{ "query": { "match": { "name": "张" } }}
三
的所有记录,并给出相关性得分GET /example/_search{ "query": { "match_phrase": { "name": "张 三" } }}
GET /example/_search{ "query": { "multi_match": { "query": "1", "fields": ["id","counter"] } }}
GET /example/_search{ "query": { "bool": { "must": [ { "match": { "id": 2 } }, { "match": { "name": "张三" } } ] } }}
must_not:子句(查询)不得出现在匹配的文档中BooleanQuery
。它是使用一个或多个布尔子句构建的,每个子句都具有类型的出现。发生类型为:must
查询为例:filter
来替代must
查询,需要注意的是,使用filter
查询出的结果和must
查询出的结果是一致的,差异仅是没有相关性得分:should
之后还可以加上filter
条件进行过滤:全文检索字段用 match,其他非 text 字段匹配用 term
。GET /example/_search{ "query": { "term": { "id":1 } }}
注意
:如果对于文本值使用 term 检索时,并不会进行分词,而是精确检索,所以可能会匹配不到数据:分组和提取数据
的能力。 最简单的聚合方法大致等于 SQL GROUP BY
和 SQL 聚合函数
。 在 Elasticsearch 中,您有执行搜索返回 hits (命中结果),并且同时返回聚合结果, 把一个响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合, 并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的 API 来避免网络往返。"aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggregations" : { [<sub_aggregation>]+ } ]? } [,"<aggregation_name_2>" : { ... } ]*}
text
,keyword
long
, integer
, short
, byte
, double
, float
, half_float
, scaled_float
date
boolean
binary
geo_point
纬度/经度坐标geo_shape
用于多边形等复杂形状ip
用于描述 IPv4 和 IPv6 地址completion
提供自动完成提示token_count
用来统计字符串中词条的数量attachment
数据类型。query-dsl
)的查询Mapping 是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和索引的
。比如,使用mapping来定义:GET bank/_mapping
PUT /my-index{ "mappings": {//映射规则 "properties": { "age": { "type": "integer" }, "email": { "type": "keyword" },//keyword不会进行全文检索 "name": { "type": "text" }//text保存的时候进行分词,搜索的时候进行全文检索 } }}
3)、新版本改变解决
: 1)、将索引从多类型迁移到单类型,每种类型文档一个独立索引 2)、将已存在的索引下的类型数据,全部迁移到指定位置即可。详见数据迁移关键词:实战,入门