Elasticsearch 學習(2)
阿新 • • 發佈:2020-08-07
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 是解析網頁的包(爬蟲用的)