Elasticsearch,简称ES。
功能:实时的存储、检索数据、日志统计、分析、系统监控
官网:https://www.elastic.co/cn
没有ES之前,使用Mysql实现模糊查询
LIKE CONCAT('%', "搜索词", '%')
问题:
1. 搜索词是一个整体,不能拆分
2. 效率低,不会用到索引
学ES之后:
在ES中存储一些数据(id,商品名字,图片,价格,浏览量)
# 开启跨域
http.cors.enabled: true
# 所有人访问
http.cors.allow-origin: "*"
在目录地址输入cmd进入命令行 npm install
npm run start
i18n.locale: "zh-CN"
GET _analyze
{
"analyzer": "ik_max_word",//分词器类型
"text": "社会新闻"//分词内容
}
回顾Mysql:
数据库–>表(表名,字段)–>记录(一行数据)
ES:
索引:同类型文档的集合(表)
文档:一行数据就是一个文档Json格式(Mysql中的一行记录)
字段:Json中的字段(属性)
映射:索引中文档的约束,字段名称,类型
正向索引和倒向索引
正向索引:
正向索引以文档编号为视角看待索引词,即通过文档编号去找索引词。具体来说,正向索引表以文档的ID为关键字,表中记录文档中每个字的位置信息。在查找时,扫描表中每个文档中字的信息,直到找出所有包含查询关键字的文档。正向索引的优点是结构简单,建立和维护都比较方便。但如果需要查询某个关键词,需要扫描所有文档,效率较低。
倒排索引:
倒排索引以字或词为关键字进行索引,即从关键词到文档的映射关系。表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,记录该文档的ID和字符在该文档中出现的位置情况。倒排索引的优点是查询效率高,因为可以一次性获取所有包含关键词的文档。但它的建立和维护相对复杂。
创建索引库
PUT /news
{
"mappings": {
"properties": {
"id":{
"type": "integer",
"index": false
},
"title":{
"type": "text",
"analyzer": "ik_smart"
},
"img":{
"type": "keyword",
"index": false
},
"pageview":{
"type": "integer",
"index": false
}
}
}
}
查询索引库
GET /news
修改索引库
PUT /news/_mapping
{
"properties":{
"title":{
"type":"text",
"analyzer":"ik_smart"
}
}
}
删除索引库
DELETE /news
新增文档
POST /news/_doc/10
{
"id":10,
"title":"标题",
"img":"eee.jpg",
"count":205
}
查询文档
GET /news/_doc/5
删除文档
DELETE /news/_doc/9
修改文档
POST /news/_update/10
{
"doc": {
"count":500,
"img":"b.png",
"title":"标题"
}
}
搜索文档
GET /news/_search
{
"query": {
"match": {
"title": "反向消费"
}
}
}
<properties>
<java.version>1.8java.version>
<elasticsearch.version>7.6.1elasticsearch.version>
properties>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
dependency>
添加初始化RestHighLevelClient的配置类
@Autowired
RestHighLevelClient restHighLevelClient;
CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
判断索引库是否存在
GetIndexRequest request = new GetIndexRequest("users");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
删除索引库
DeleteIndexRequest indexRequest = new DeleteIndexRequest("users");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);
delete.isAcknowledged();//返回 true 删除成功,返回 false 删除失败
//将新闻添加到 mysql 的同时,将数据同步更新到 ES,为搜索提供数据
News news = new News();
news.setId(3);
news.setTitle("美国今年要总统选择,拜登着急了");
news.setImg("aaaaasssss.jpg");
IndexRequest indexRequest = new IndexRequest("news").id(news.getId().toString());
//将对象转为 json 存进 ES
indexRequest.source(new ObjectMapper().writeValueAsString(news),XContentType.JSON);
restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);
修改文档
News news = new News();
news.setId(3);
news.setTitle("中国航母开往美国,准备开战,拜登着急了");
news.setImg("dddddddddddd.jpg");
UpdateRequest updateRequest = new UpdateRequest("news",news.getId().toString());
updateRequest.doc(new ObjectMapper().writeValueAsString(news), XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
查询文档
GetRequest getRequest = new GetRequest("news","1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
//获取查询的内容,返回 json 格式
String json = getResponse.getSourceAsString();
//使用 jackson 组件将 json 字符串解析为对象
News news = new ObjectMapper().readValue(json, News.class);
删除文档
DeleteRequest deleteRequest = new DeleteRequest("news","1");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
搜索文档
SearchRequest searchRequest = new SearchRequest("news");
SearchRequest searchRequest = new SearchRequest("news");
//精确条件查询
searchRequest.source().query(QueryBuilders.termQuery("title","美国"));
//发送查询请求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//接收查询结果
SearchHits hits = search.getHits();
//组装查询结果
ArrayList<News> list = new ArrayList<>();
//取出结果集
for (SearchHit searchHit : hits.getHits()){
String json = searchHit.getSourceAsString();
News news = new ObjectMapper().readValue(json,News.class);
list.add(news);
}
高亮显示
searchRequest.source().highlighter(new
HighlightBuilder().field("title").requireFieldMatch(false));
//组装查询结果
ArrayList<News> list = new ArrayList<>();
for (SearchHit searchHit : hits.getHits()){
String json = searchHit.getSourceAsString();
News news = new ObjectMapper().readValue(json,News.class);
//获取高亮名称
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
HighlightField titleField = highlightFields.get("title");
String highttitle = titleField.getFragments()[0].string();
news.setTitle(highttitle);//用添加了高亮的标题替换原始文档标题内容
list.add(news);
}
Hbuilder中使用v-html解析标题