注意 这些所以的东西版本都要一样
ElasticSearch安装
jdk至少1.8 ElasticSearch客户端,界面工具
注意
jdk必须与cpu的位数是一样的 否则会报JNA错误
下载地址
https://www.elastic.co/cn/ shearch和kibabn
https://github.com/medcl/elas... ik分词器
https://github.com/mobz/elast... head插件下载
这些都是解压可用
Elasticearch 启动
点击 bin\下的elasticsearch.bat
如果电脑内存不够大 启动前 记得去 config\jvm.options 修改
-Xms256m
-Xmx256m
head插件
必须要有 nodejs 因为他是前端写的
- cnpm install 安装依赖
- cnpm run start
注意如果9100端口被占用
netstat -ano | findstr "9100"
然后去任务管理器详细信息里去关
启动成功访问 http://localhost:9100/
9200 和 9100 是跨域的
需要在elasticearch.yaml中配置跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
然后重启es服务
head就相当于navicat
kibana
这也是一个标准的前端化工程
bin\kibana.bat
找到开发工具
汉化!!!!
改配置kibana.yaml
i18n.locale: "zh-CN"
IK分词器(中文) elasticsreach默认的不是中文的
放在elasticsreach中的plugins中
有两种算法
- ik_smart 默认分词器 他所能理解 不重复的单词 或者字
ik_max_word 最细粒度 穷进词库可能
GET _analyze { "analyzer": "ik_smart", "text": "我超级喜欢多帅哦" } GET _analyze { "analyzer": "ik_max_word", "text": "我超级喜欢多帅哦" }
你自己需要的词,需要自己加到字典中
IKAnalyzer.cfg.xml
编写自己的kb.dic
然后在配置文件中添加
kb.dic
重启es
Rest风格
1、创建一个索引 随到在请求体中插入数据
PUT /索引名/类型名(可无)/文档id
{
json请求体
}
添加
创建一个索引,指定字段类型 但是没有插入信息
PUT /test2
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"age": {
"type": "long"
},
"birthday":{
"type": "date"
}
}
}
}
获得信息
GET test2
如果不写就是默认类型 _doc keyword是不可分割的
PUT /test3/_doc/1
{
"name": "多帅哦",
"age": 18,
"birthday": "1999-10-20"
}
GET _cat/health 数据库状态
GET _cat/indices?v 数据库信息
修改
1、直接暴力PUT
PUT /test3/_doc/1{ "name": "多帅哦123", "age": 18, "birthday": "1999-10-20"}但是索引信息会改变 版本啊 状态啊
2、POST
POST /test3/_doc/1/_update{ "doc":{ "name":"shuaikb" }}
3、删除索引
DELETE test1 根据你的请求是删除什么 索引或者文档
条件查询
GET /test3/_search?q=name:多帅哦/"_score" : 0.5753642,这个_score是匹配度 匹配度越高分数越高
复杂搜索
GET /test3/_search{ "query": { "match": { "name": "多帅" } }}name里包含 多帅 的都会出来"hits"里面包含了 索引的信息 和查询的结果GET /test3/_search{ "query": { "match": { "name": "多帅" } }, "_source": ["name","age"]}查询数据中只显示 name和age以后在java中操作es 所有的方法都是这里的key排序"sort": [ { "age": { "order": "desc" } } ]通过什么字段进行排序 desc降序 asc升序分页"from": 0, 第几个数据开始"size": 1 返回多少条
布尔值查询
GET /test3/_search{ "query": { "bool": { "must": [ { "match": { "name": "多帅" } }, { "match":{ "age": 18 } } ] } }}精确匹配 多条件查询 must 相当于 and should 想当于 ornot 相当于 !=GET /test3/_search{ "query": { "bool": { "must": [ { "match": { "name": "多帅" } } ], "filter": [ { "range": { "age": { "gte": 10, "lte": 17 } } } ] } }}filter 可以进行数据过滤 gt> gte>= lt< lte<= eq
GET /test3/_search{ "query": { "match": { "tag": "男 技术" } }}tag查询的多个属性 用空格隔开term,查询时通过倒排是索引进行精确查询match,会使用分词器解析 (先分析文档,然后通过分析文档进行查询!)
两个类型
- text 能被分词器解析
- keyword 不能被分词器解析
GET _analyze{ "analyzer": "standard", "text": "多帅哦Shuaikb name1"}只要分词器不是keyword就不会被拆分GET testdb/_search{ "query": { "term": { "desc": { "value": "多帅哦Shuaikb desc" } } }}精确匹配 keyword类型的字段不会被分词器解析你会发现 多帅哦Shuaikb desc2不会被查询出来
多个值匹配的精确查询
GET testdb/_search{ "query": { "bool": { "should": [ { "term": { "t1": { "value": "22" } } }, { "term": { "t1": { "value": "33" } } } ] } }}
高亮查询
GET testdb/_search{ "query": { "match": { "name": "帅" } }, "highlight": { "fields": { "name": {} } }}"多帅哦Shuaikb name2"这个就是高亮的html自定义搜索高亮条件GET testdb/_search{ "query": { "match": { "name": "帅" } }, "highlight": { "pre_tags": "", "post_tags": "
", "fields": { "name": {} } }}
Spirngboot集成es
原生依赖 es-snapshots elasticsearch snapshot repo https://snapshots.elastic.co/maven/ 实际我们导入的依赖 org.springframework.boot spring-boot-starter-data-elasticsearch 注意依赖的版本必须要和自己的本地的es版本一致所以需要自定义版本依赖初始化RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http")));用完记得关client.close();@Bean public RestHighLevelClient restHighLevelClient(){ RestHighLevelClient client =new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"))); return client; }
API
索引操作
@Test public void CreateIndex() throws IOException { //创建索引 CreateIndexRequest requst = new CreateIndexRequest("shuaikb_index"); //执行请求 获得响应 CreateIndexResponse createIndexResponse = client.indices().create(requst, RequestOptions.DEFAULT); System.out.println(createIndexResponse); } @Test void testExisIndex() throws IOException { //判断存在 GetIndexRequest request =new GetIndexRequest("shuaikb_index"); boolean exists = client.indices().exists(request, RequestOptions.DEFAULT); System.out.println(exists); } @Test void testDeleteIndex() throws IOException { //删除索引 DeleteIndexRequest request =new DeleteIndexRequest("shuaikb_index"); AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT); System.out.println(delete); }
文档操作
@Test void testAddDocument() throws IOException { //添加文档 Dog dog = new Dog(); dog.setName("多帅哦"); dog.setAge(12); IndexRequest requst = new IndexRequest("shuaikb_index"); //规则 PUT /shuaikb_index/_doc/1 requst.id("1"); requst.timeout(TimeValue.timeValueSeconds(1)); requst.timeout("1s"); //将我们的数据放入请求 json requst.source(JSON.toJSONString(dog), XContentType.JSON); //客户端发送请求 IndexResponse indexResponse = client.index(requst, RequestOptions.DEFAULT); System.out.println(indexResponse.toString()); System.out.println(indexResponse.status()); } @Test void testExisDocument() throws IOException { //判断文档存在 GetRequest getRequest = new GetRequest("shuaikb_index","1"); //不获取返回的_source的上下文 getRequest.fetchSourceContext(new FetchSourceContext(false)); getRequest.storedFields("_noe_"); boolean exists = client.exists(getRequest, RequestOptions.DEFAULT); System.out.println(exists); } @Test void testGetDocument() throws IOException { //获取文档信息 GetRequest getRequest = new GetRequest("shuaikb_index","1"); GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT); System.out.println(documentFields.getSourceAsString()); System.out.println(documentFields); } @Test void testUpdateDocument() throws IOException { //更新文档信息 UpdateRequest updateRequest = new UpdateRequest("shuaikb_index","1"); updateRequest.timeout("1s"); Dog dog = new Dog("你怎么说",20); updateRequest.doc(JSON.toJSONString(dog),XContentType.JSON); client.update(updateRequest,RequestOptions.DEFAULT); } @Test void testDeleteDocument() throws IOException { //删除文档信息 DeleteRequest deleteRequest = new DeleteRequest("shuaikb_index","1"); deleteRequest.timeout("1s"); DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(delete); }
大量数据操作
//大量数据操作 @Test void testBulkRequest() throws IOException { BulkRequest bulkRequest = new BulkRequest(); bulkRequest.timeout("10s"); ArrayList dogArrayList = new ArrayList(); dogArrayList.add(new Dog("test1",1)); dogArrayList.add(new Dog("test2",1)); dogArrayList.add(new Dog("test3",1)); dogArrayList.add(new Dog("test4",1)); dogArrayList.add(new Dog("shuaikb1",1)); dogArrayList.add(new Dog("shuaikb2",1)); dogArrayList.add(new Dog("shuaikb3",1)); dogArrayList.add(new Dog("shuaikb4",1)); for (int i = 0; i