ElasticSearch 入门

发布于 / 2个月前 - 更新于 / 2个月前


前言需求

门户内容网站,需要全站搜索相关内容文章,根据标题或简介等内容模糊查询。
以上需求能想到的实现方式就是 ElasticSearch 搜索引擎了 以下简称es

实现方式流程:
网站在创建、修改和删除时,同步es数据引擎
每个内容文章提取标题(title)简介(description)访问地址(uri)排序值(可以是访问数,点赞数,等),组成一下json格式

{ "title":"标题", "description":"简介", "uri":"内容访问地址", "sort":"sort" }

且每个内容文章生成一个唯一id(方式不限,唯一就行)
在创建和修改时使用一下方式同步es数据引擎

POST localhost:9200/data/article/id (id为上面生成唯一id) { "title":"标题", "description":"简介", "uri":"内容访问地址", "sort":666 }

删除时使用一下方式删除

DELETE localhost:9200/data/article/id

在搜索时,根据输入的内容请求(以sort降序)

GET localhost:9200/data/article/_search { "query":{ "multi_match":{ "query": "无言", "fields": ["title","description"] } }, "sort":[ # 可以多字段排序 { "sort":{ "order":"desc" } } ], "from": 0,# 乘以size的值为页码值 "size": 10 # 分页每页数据量 }

以上只要title或description中包含,都能查询出来,默认显示10条数据,数据中包含的就是上面的json数据,根据其中uri则可直接跳转到内容详细页面。

es具体操作如下

安装

首选 docker 安装 参考地址

# 下载镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.1 # 运行 ElasticSearch docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.11.1 # 访问验证 正常会返回一个json数据 curl "localhost:9200"

使用

创建索引

curl -XPUT "localhost:9200/data"

查看索引

curl -XGET "localhost:9200/data"

创建数据

curl -H "Content-Type: application/json" -XPOST localhost:9200/data/user -d '{"title":"无言","description":"测试数据"}'

查询数据

# 查询 data 所有数据 curl -XGET "localhost:9200/data/user/_search" # 查询 title 包含 `言` curl -XGET "localhost:9200/data/user/_search?q=title:言" # 发送json结构参数查询 # json参数格式说明 { "query":{ # 固定值 "查询类型":{ "查询条件":"查询条件值" } } } # 查询类型 # match:返回所有匹配的分词。 # match_all:查询全部。 # match_phrase:短语查询,在match的基础上进一步查询词组,可以指定slop分词间隔。 # match_phrase_prefix:前缀查询,根据短语中最后一个词组做前缀匹配,可以应用于搜索提示,但注意和max_expanions搭配。其实默认是50....... # multi_match:多字段查询,使用相当的灵活,可以完成match_phrase和match_phrase_prefix的工作。 # 查询所有 GET localhost:9200/data/user/_search { "query":{ "match_all":{} } } # 查询 title 包含 `言` GET localhost:9200/data/user/_search { "query":{ "match":{ "title":"言" } } } # 查询 title 包含 `无言` 短语 GET localhost:9200/data/user/_search { "query":{ "match_phrase":{ "title":"无言" } } } # 查询 title 和 description 包含 `无言 GET localhost:9200/data/user/_search { "query":{ "multi_match":{ "query":"无言", "fields":["title","description"] } } }

参考地址:https://www.jianshu.com/p/3873a6290c65

本作品采用《CC 协议》,转载必须注明作者和本文链接