标签:学习 索引 client 文档 elasticsearch org import Elasticsearch
Elasticsearch
目录
Elasticsearch 环境安装
-
下载Elasticsearch
-
配置跨域
http.cors.enabled: true http.cors.allow-origin: "*"
-
下载Elasticsearch-head
-
下载操作可视化工具 kibana
ik 分词器
先下载 ik 分词器 放到Elasticsearch 的 plugins 的ik z中
- ik_max_word 最细粒度
- ik_smart 最小拆分
ik 分词器配置
IKAnalyzer.cfg.xml 配置分词规则
-
自定义自己分词规则
-
新建 xx.dic 文件
-
配置到IKAnalyzer.cfg.xml
<entry key="ext_dict">xx.dic</entry>
-
把自己的分词规则放到 xx.dic 文件中
-
索引基本操作
mothod | url 地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档id |
POST | localhost:9200/索引名称/类型名称/_search | 查询所有数据 |
创建索引
put /索引名称/类型名/文档id {请求数据}
Elasticsearch 字符类型
- 字符串类型 text keyword
- 数值类型 long integer short byte double float half float scaled
- 日期类型 date
- 布尔值类型 boolen
- 二进制类型 binary
- 等等...
指定类型
先新建索引
put /索引名称/类型名/文档id {
"mapping":{
"properties":{
"字段名称":{
"type":"类型"
}
}
}
}
获取数据信息 Get
get 表/文旦 等
默认指定类型 _doc
_cat 它帮助开发者快速查询Elasticsearch的相关信息。
修改数据put/update (曾经) post(现在)
删除 delete
例子 :PUT /test/vus/1
{
"name":"什么说的好的",
"age":"20"
}
文档的基本操作
基本操作
查询
GET /索引名称/类型名称/文档id(有没有都可以)/_search?q=条件(如name:java)
结果里面有个score 匹配度 就是匹配度越高分值越高
复杂操作
查询 (排序 高亮 )
GET /索引名称/类型名称/文档id(有没有都可以)/_search
{
"query":{
"match":{
条件(例如 "name":"java")
}
},
"_source":[要查询的字段(意思是筛选字段)],
"sort":{
字段(根据那个字段排序):{
"order":"desc/aesc"
}
},
--分页
"from":0, //从那条数据开始
"size":20 //一页有几条数据
}
根据score 那个更匹配
布尔值查询
GET /索引名称/类型名称/文档id(有没有都可以)/_search
{
"query":{
"bool":{
"must"( 中有filter/must/must not /should):[
{
"match":
{
条件("name":"java")
},
"match":
{
条件("age":"20")
},
........
}
],
"filter"( 中有filter/must/must not /should):[
{
"range":
{
条件("age"):{
"gle":"", //大于等于多少gl是大于
"lte":"" //小于等于多少lt是小于
}
}
}
]
}
}
}
must 和sql 中 where 中and相同
should 和where中or相同
mast not 是不等于
匹配多个条件
GET /索引名称/类型名称/文档id(有没有都可以)/_search
{
"query":{
"match":{
条件加空格(例如 "name":"java php" 这是只要满足一个条件就可以查出来)
}
}
}
精确查询
-
term 查询是直接通过倒排索引指定的词条进程精确的查找(直接查找精确的值 查询多个值的时候需要重新写个term 不能直接加空格)
-
match 会使用分词器解析(通过分析文档 然后在通过分析文档进行查询)
两个类型 text和keyword text可以用分词器解析keyword 不会用分词器解析
高亮查询
GET /索引名称/类型名称/文档id(有没有都可以)/_search
{
"query":{
"match":{
条件(例如 "name":"java")
}
},
"highlight":{ //高亮
"pre_tags":自定义标签前缀,(如"<B class="hah">")
"post_tags":自定义的后缀,(如 "</B>")
"fields":{
字段:{} //高亮的字段
}
}
}
搜索的结果自动加上一个html标签 或者自定义的标签
集成springboot
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.8.1</version>
</dependency>
package com.example.elasticsearch.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient client(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
return client;
}
}
package com.example.elasticsearch;
import com.alibaba.fastjson.JSON;
import com.example.elasticsearch.vo.user;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
RestHighLevelClient client;
@Test
void contextLoads() throws IOException {
//===========================================================================
//创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("哈哈");
CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
//===========================================================================
//获取索引
GetIndexRequest 哈哈 = new GetIndexRequest("哈哈");
boolean exists = client.indices().exists(哈哈, RequestOptions.DEFAULT);
//===========================================================================
// 删除索引
DeleteIndexRequest 哈哈1 = new DeleteIndexRequest("哈哈");
AcknowledgedResponse acknowledgedResponse= client.indices().delete(哈哈1,RequestOptions.DEFAULT);
//===========================================================================
//创建文档
user user=new user();
user.setAge(20);
user.setName("li");
IndexRequest request = new IndexRequest("哈哈"); //获取索引
request.id("1");
request.timeout(TimeValue.MINUS_ONE);//超时时间
request.source(JSON.toJSON(user), XContentType.JSON);
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
index.status();//获取执行状态
//===========================================================================
//获取文档
GetRequest getRequest = new GetRequest("哈哈","1");
getRequest.fetchSourceContext(new FetchSourceContext(false));
boolean exists1 = client.exists(getRequest, RequestOptions.DEFAULT);//判断是否存在
GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
//===========================================================================
//更新 文档
UpdateRequest update = new UpdateRequest("哈哈","1");
update.timeout("1s");
user=new user();
user.setAge(21);
user.setName("lilong");
UpdateRequest doc = update.doc(JSON.toJSON(user), XContentType.JSON);
UpdateResponse update1 = client.update(doc, RequestOptions.DEFAULT);
//===========================================================================
//删除文档
DeleteRequest deleteRequest = new DeleteRequest("哈哈", "1");
deleteRequest.timeout("1s");
DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
delete.status();
//===========================================================================
//批量请求
BulkRequest bulkRequest=new BulkRequest();
List<user> usr = new ArrayList<>();
for (int i=0;i<usr.size();i++){ //批量删除 更新在这更改就可以了
bulkRequest.add(new IndexRequest("哈哈").id("1"+i).source(JSON.toJSON(usr.get(i)),XContentType.JSON));
}
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
bulk.hasFailures();//是否执行成功
//===========================================================================
//查询
SearchRequest searchResponse=new SearchRequest("哈哈");
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("hahh", "en"); //QueryBuilders 这里面有很多精确查询
searchSourceBuilder.query(termQueryBuilder);
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.MICROSECONDS));
searchResponse.source(searchSourceBuilder);
SearchResponse search = client.search(searchResponse, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
String s = JSON.toJSONString(hits);
//=============================================
//高亮
HighlightBuilder highlightBuilder=new HighlightBuilder();
highlightBuilder.field("字段名称");
highlightBuilder.requireFieldMatch(false);//是否显示多个高亮
highlightBuilder.preTags("<span style='color:red'");
highlightBuilder.postTags("</span>");
searchSourceBuilder.highlighter(highlightBuilder);
List<Map> list=new ArrayList<>();//就是得到最后的结果
for (SearchHit d:hits.getHits()){
Map<String, Object> sourceAsMap = d.getSourceAsMap();
//====高亮取出
Map<String, HighlightField> highlightFields = d.getHighlightFields();
HighlightField highlightField = highlightFields.get("字段名称");
Text[] fragments = highlightField.fragments();
String realut="";
for (Text text:fragments){
realut+= text;
}
sourceAsMap.put("字段名称",realut);
list.add(sourceAsMap);
}
}
}
jsoup 是解析网页的包(爬虫用的)
标签:学习,索引,client,文档,elasticsearch,org,import,Elasticsearch 来源: https://www.cnblogs.com/wyxqlgl/p/13454158.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。