【ES 6.5.4 】ElasticSearch知識點
ElaticSearch
1.索引基本操作
1.1 建立一個索引
#建立一個索引
PUT /person
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
1.2 檢視索引資訊
#檢視索引
GET /person
1.3 刪除索引
#刪除索引
DELETE /person
1.4 ES中Field可以指定的型別
#String: text:一般用於全文檢索。將當前的field進行分詞 # keyword: 當前的Field不可被分詞 # # # #
1.5 建立索引並指定資料結構
——以建立小說為例子
PUT /book { "settings": { #備份數 "number_of_replicas": 1, #分片數 "number_of_shards": 5 }, #指定資料結構 "mappings": { #指定型別 Type "novel": { # 檔案儲存的Field屬性名 "properties": { "name": { "type": "text", "analyzer": "ik_max_word", # 指定當前的Field可以作為查詢的條件 "index": true }, "authoor": { "type": "keyword" }, "onsale": { "type": "date", "format": "yyyy-MM-dd" } } } } }
1.6 文件的操作
- 文件在ES服務中的唯一標誌,_index, _type, _id 三個內容為組合,來鎖定一個文件,操作抑或是修改
1.6.1 新建文件
- 自動生成id
PUT /book/novel
{
"name": "西遊記",
"authoor": "劉明",
"onsale": "2020-12-11"
}
- 手動指定ID(更推薦)
PUT /book/novel/1 { "name": "三國演義", "authoor": "小明", "onsale": "2020-12-11" }
1.6.2 修改文件
-
覆蓋式修改
POST /book/novel/1 { "name": "三國演義", "authoor": "小明", "onsale": "2020-12-11" }
-
doc修改方式(更推薦)
POST /book/novel/1/_update { "doc": { "name": "極品家丁" } } #先鎖定文件,_update 修改需要的欄位即可
1.6.3 刪除文件
-
刪庫跑路
DELETE /book/novel/1
2. java操作ElaticSearch
2.1 Java連結ES
1、建立Maven工程
匯入依賴
# 4個依賴
1、1 elasticsearch
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.5.4</version>
</dependency>
1、2 elasticsearch的高階API
<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.5.4</version>
</dependency>
1、3 junit
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
1、4 lombok
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
2.1.2 建立測試類,連線ES
// 先建立連線,工具類
public class ESClient {
public static RestHighLevelClient getClient(){
// 建立HttpHost物件
HttpHost httpHost = new HttpHost("127.0.0.1",9200);
// 建立RestClientBuilder
RestClientBuilder builder = RestClient.builder(httpHost);
// 建立RestHighLevelClien物件
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
2.2 java建立索引
import com.dengzhou.utils.ESClient;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.junit.jupiter.api.Test;
import java.io.IOException;
public class Create_ES_Index {
String index = "person";
String type = "man";
@Test
public void createIndex() throws IOException {
//1、 準備關於索引的settings
Settings.Builder settings = Settings.builder()
.put("number_of_shards", 3)
.put("number_of_replicas", 1);
//2、 準備關於索引的結構mappings
XContentBuilder mappings = JsonXContent.contentBuilder()
.startObject()
.startObject("properties")
.startObject("name")
.field("type","text")
.endObject()
.startObject("age")
.field("type","integer")
.endObject()
.startObject("birthday")
.field("type","date")
.field("format","yyyy-MM-dd")
.endObject()
.endObject()
.endObject();
//2 將settings 和 mappings封裝成一個request物件
CreateIndexRequest request = new CreateIndexRequest(index)
.settings(settings)
.mapping(type,mappings);
//3 通過client物件去連結es並執行建立索引
RestHighLevelClient client = ESClient.getClient();
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
//測試
System.out.println("response"+response.toString());
}
2.3 檢查索引是否存在,刪除索引
//檢查索引是否存在
@Test
public void exists() throws IOException {
//1 準備request物件
GetIndexRequest request = new GetIndexRequest();
request.indices(index);
// 2 通過client去檢查
RestHighLevelClient client = ESClient.getClient();
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
2.4 修改文件
-
新增文件操作
@Test public void createDoc() throws IOException { ObjectMapper mapper = new ObjectMapper(); // 1. 準備json資料 Person person = new Person(1, "張三", 23, new Date()); String json = mapper.writeValueAsString(person); System.out.println(json); // 2. 準備一個request物件(手動指定id建立) IndexRequest indexRequest = new IndexRequest(index,type,person.getId().toString()); indexRequest.source(json, XContentType.JSON); // 3、通過client物件執行新增操作 RestHighLevelClient client = ESClient.getClient(); IndexResponse resp = client.index(indexRequest, RequestOptions.DEFAULT); // 4、 輸出返回 System.out.println(resp.getResult().toString()); }
-
修改文件
// 修改文件,通過doc方式 @Test public void updateDoc() throws IOException { // 建立map,指定需要修改的內容 Map<String,Object> map = new HashMap<String, Object>(); map.put("name","李四"); String docId = "1"; // 建立一個request物件,封裝資料 UpdateRequest updateRequest = new UpdateRequest(index,type,docId); updateRequest.doc(map); // 通過client物件執行 RestHighLevelClient client = ESClient.getClient(); UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT); // 返回輸出結果 System.out.println(update.getResult().toString()); }
2.5 刪除文件
2.6 java批量操作文件
3.ElasticSearch練習
-
索引 : sms-logs-index
-
型別:sms-logs-type
欄位名稱 | 備註 |
---|---|
createDate | 建立時間String |
sendDate | 傳送時間 date |
longCode | 傳送長號碼 如 16092389287811 string |
Mobile | 如 13000000000 |
corpName | 傳送公司名稱,需要分詞檢索 |
smsContent | 下發簡訊內容,需要分詞檢索 |
State | 簡訊下發狀態 0 成功 1 失敗 integer |
Operatorid | 運營商編號1移動2聯通3電信 integer |
Province | 省份 |
ipAddr | 下發伺服器IP地址 |
replyTotal | 簡訊狀態報告返回時長 integer |
Fee | 扣費 integer |
-
建立例項程式碼
//先定義索引名和型別名 String index = "sms_logs_index"; String type = "sms_logs_type";
public void create_index() throws IOException { Settings.Builder settings = Settings.builder() .put("number_of_shards", 3) .put("number_of_replicas", 1); XContentBuilder mappings = JsonXContent.contentBuilder() .startObject() .startObject("properties") .startObject("createDate") .field("type", "text") .endObject() .startObject("sendDate") .field("type", "date") .field("format", "yyyy-MM-dd") .endObject() .startObject("longCode") .field("type", "text") .endObject() .startObject("mobile") .field("type", "text") .endObject() .startObject("corpName") .field("type", "text") .field("analyzer", "ik_max_word") .endObject() .startObject("smsContent") .field("type", "text") .field("analyzer", "ik_max_word") .endObject() .startObject("state") .field("type", "integer") .endObject() .startObject("operatorid") .field("type", "integer") .endObject() .startObject("province") .field("type", "text") .endObject() .startObject("ipAddr") .field("type", "text") .endObject() .startObject("replyTotal") .field("type", "integer") .endObject() .startObject("fee") .field("type", "integer") .endObject() .endObject() .endObject(); CreateIndexRequest request = new CreateIndexRequest(index) .settings(settings) .mapping(type,mappings); RestHighLevelClient client = ESClient.getClient(); CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT); System.out.println(response.toString()); }
-
資料匯入部分
PUT /sms_logs_index/sms_logs_type/1 { "corpName": "途虎養車", "createDate": "2020-1-22", "fee": 3, "ipAddr": "10.123.98.0", "longCode": 106900000009, "mobile": "1738989222222", "operatorid": 1, "province": "河北", "relyTotal": 10, "sendDate": "2020-2-22", "smsContext": "【途虎養車】親愛的燈先生,您的愛車已經購買", "state": 0 }
-
4. ES的各種查詢
4.1 term&terms查詢
4.1.1 term查詢
- term的查詢是代表完全匹配,搜尋之前不會對你的關鍵字進行分詞
#term匹配查詢
POST /sms_logs_index/sms_logs_type/_search
{
"from": 0, #limit from,size
"size": 5,
"query": {
"term": {
"province": {
"value": "河北"
}
}
}
}
##不會對term中所匹配的值進行分詞查詢
// java程式碼實現方式
@Test
public void testQuery() throws IOException {
// 1 建立Request物件
SearchRequest request = new SearchRequest(index);
request.types(type);
// 2 指定查詢條件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.from(0);
builder.size(5);
builder.query(QueryBuilders.termQuery("province", "河北"));
request.source(builder);
// 3 執行查詢
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 4 獲取到_source中的資料
for (SearchHit hit : response.getHits().getHits()) {
Map<String, Object> result = hit.getSourceAsMap();
System.out.println(result);
}
}
-
terms是針對一個欄位包含多個值得運用
- terms: where province = 河北 or province = ? or province = ?
#terms 匹配查詢 POST /sms_logs_index/sms_logs_type/_search { "from": 0, "size": 5, "query": { "terms": { "province": [ "河北", "河南" ] } } }
// java程式碼 terms 查詢 @Test public void test_terms() throws IOException { SearchRequest request = new SearchRequest(index); request.types(type); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.termsQuery("province","河北","河南")); request.source(builder); RestHighLevelClient client = ESClient.getClient(); SearchResponse resp = client.search(request, RequestOptions.DEFAULT); for (SearchHit hit : resp.getHits().getHits()){ System.out.println(hit); } }
4.2 match查詢
match查詢屬於高層查詢,它會根據你查詢欄位型別不一樣,採用不同的查詢方式
match查詢,實際底層就是多個term查詢,將多個term查詢的結果進行了封裝
-
查詢的如果是日期或者是數值的話,它會根據你的字串查詢內容轉換為日期或者是數值對等
-
如果查詢的內容是一個不可被分的內容(keyword),match查詢不會對你的查詢的關鍵字進行分詞
-
如果查詢的內容是一個可被分的內容(text),match則會根據指定的查詢內容按照一定的分詞規則去分詞進行查詢
4.2.1 match_all查詢
查詢全部內容,不指定任何查詢條件
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match_all": {}
}
}
@Test
public void test_match_all() throws IOException {
// 建立Request ,放入索引和型別
SearchRequest request = new SearchRequest(index);
request.types(type);
builder.size(20); //es預設查詢結果只展示10條,這裡可以指定展示的條數
//指定查詢條件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchAllQuery());
request.source(builder);
// 執行查詢
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 獲取查詢結果,遍歷顯示
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit);
}
}
4.2.2 match查詢 根據某個Field
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match": {
"smsContent": "打車"
}
}
}
@Test
public void test_match_field() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("smsContext","打車"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit);
}
}
4.2.3 布林match查詢
基於一個Filed匹配的內容,採用and或者or的方式進行連線
# 布林match查詢
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"match": {
"smsContext": {
"query": "打車 女士",
"operator": "and" #or
}
}
}
}
@Test
public void test_match_boolean() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchQuery("smsContext","打車 女士").operator(Operator.AND));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit);
}
4.2.4 multi_match查詢
match針對一個field做檢索,multi_match針對多個field進行檢索,多個key對應一個text
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"multi_match": {
"query": "河北", #指定text
"fields": ["province","smsContext"] #指定field
}
}
}
// java 實現
@Test
public void test_multi_match() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
// 查詢的文字內容 欄位1 欄位2 欄位3 。。。。。
builder.query(QueryBuilders.multiMatchQuery("河北", "province", "smsContext"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit);
}
}
4.3 ES 的其他查詢
4.3.1 ID 查詢
# id查詢
GET /sms_logs_index/sms_logs_type/1
GET /索引名/type型別/id
public void test_multi_match() throws IOException {
GetRequest request = new GetRequest(index,type,"1");
RestHighLevelClient client = ESClient.getClient();
GetResponse resp = client.get(request, RequestOptions.DEFAULT);
System.out.println(resp.getSourceAsMap());
}
4.3.2 ids查詢
根據多個id進行查詢,類似MySql中的where Id in (id1,id2,id3….)
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"ids": {
"values": [1,2,3] #id值
}
}
}
//java程式碼
@Test
public void test_query_ids() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.idsQuery().addIds("1","2","3"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
4.3.3 prefix查詢
字首查詢,可以通過一個關鍵字去指定一個Field的字首,從而查詢到指定的文件
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"prefix": {
"smsContext": {
"value": "河"
}
}
}
}
#與 match查詢的不同在於,prefix類似mysql中的模糊查詢。而match的查詢類似於嚴格匹配查詢
# 針對不可分割詞
@Test
public void test_query_prefix() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.prefixQuery("smsContext","河"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
4.3.4 fuzzy查詢
fuzzy查詢:模糊查詢,我們可以輸入一個字元的大概,ES就可以根據輸入的內容大概去匹配一下結果,eg.你可以存在一些錯別字
#fuzzy查詢
#fuzzy查詢
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"fuzzy": {
"corpName": {
"value": "盒馬生鮮",
"prefix_length": 2 # 指定前幾個字元要嚴格匹配
}
}
}
}
#不穩定,查詢欄位差太多也可能查不到
// java 實現
@Test
public void test_query_fuzzy() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.fuzzyQuery("corpName","盒馬生鮮").prefixLength(2));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
.prefixLength() :指定前幾個字元嚴格匹配
4.3.5 wildcard查詢
通配查詢,與mysql中的like查詢是一樣的,可以在查詢時,在字串中指定萬用字元*和佔位符?
#wildcard查詢
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"wildcard": {
"corpName": {
"value": "*車" # 可以使用*和?指定萬用字元和佔位符
}
}
}
}
?代表一個佔位符
??代表兩個佔位符
// java程式碼
@Test
public void test_query_wildcard() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.wildcardQuery("corpName","*車"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
4.3.6 range查詢
範圍查詢,只針對數值型別,對某一個Field進行大於或者小於的範圍指定
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"range": {
"relyTotal": {
"gte": 0,
"lte": 3
}
}
}
}
查詢範圍:[gte,lte]
查詢範圍:(gt,lt)
//java程式碼
@Test
public void test_query_range() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.rangeQuery("fee").lt(5).gt(2));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
4.3.7 regexp查詢
正則查詢,通過你編寫的正則表示式去匹配內容
PS: prefix,fuzzy,wildcar和regexp查詢效率相對比較低,在對效率要求比較高時,避免去使用
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"regexp": {
"moible": "109[0-8]{7}" # 匹配的正則規則
}
}
}
//java 程式碼
@Test
public void test_query_regexp() throws IOException {
SearchRequest request = new SearchRequest(index);
request.types(type);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.regexpQuery("moible","106[0-9]{8}"));
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}
4.4 深分頁Scroll
ES對from+size有限制,from和size兩者之和不能超過1w
原理:
from+size ES查詢資料的方式:
1 先將使用者指定的關鍵詞進行分詞處理
2 將分詞去詞庫中進行檢索,得到多個文件的id
3 去各個分片中拉去指定的資料 耗時
4 根據資料的得分進行排序 耗時
5 根據from的值,將查詢到的資料捨棄一部分,
6 返回查詢結果
Scroll+size 在ES中查詢方式
1 先將使用者指定的關鍵詞進行分詞處理
2 將分詞去詞庫中進行檢索,得到多個文件的id
3 將文件的id存放在一個ES的上下文中,ES記憶體
4 根據你指定給的size的個數去ES中檢索指定個數的資料,拿完資料的文件id,會從上下文中移除
5 如果需要下一頁的資料,直接去ES的上下文中,找後續內容
6 迴圈進行4.5操作
缺點,Scroll是從記憶體中去拿去資料的,不適合做實時的查詢,拿到的資料不是最新的
# 執行scroll查詢,返回第一頁資料,並且將文件id資訊存放在ES的上下文中,指定生存時間
POST /sms_logs_index/sms_logs_type/_search?scroll=1m
{
"query": {
"match_all": {}
},
"size": 2,
"sort": [
{
"fee": {
"order": "desc"
}
}
]
}
#查詢下一頁的資料
POST /_search/scroll
{
"scroll_id": "DnF1ZXJ5VGhlbkZldGNoAwAAAAAAACSPFnJjV1pHbENVVGZHMmlQbHVZX1JGdmcAAAAAAAAkkBZyY1daR2xDVVRmRzJpUGx1WV9SRnZnAAAAAAAAJJEWcmNXWkdsQ1VUZkcyaVBsdVlfUkZ2Zw==",
"scoll" :"1m" #scorll資訊的生存時間
}
#刪除scroll在ES中上下文的資料
DELETE /_search/scroll/scrill_id
//java程式碼
@Test
public void test_query_scroll() throws IOException {
// 1 建立SearchRequest
SearchRequest request = new SearchRequest(index);
request.types(type);
// 2 指定scroll資訊,生存時間
request.scroll(TimeValue.timeValueMinutes(1L));
// 3 指定查詢條件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.size(2);
builder.sort("fee",SortOrder.DESC);
builder.query(QueryBuilders.matchAllQuery());
// 4 獲取返回結果scrollid ,source
request.source(builder);
RestHighLevelClient client = ESClient.getClient();
SearchResponse response = client.search(request,RequestOptions.DEFAULT);
String scrollId = response.getScrollId();
System.out.println(scrollId);
while(true){
// 5 迴圈建立SearchScrollRequest
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
// 6 指定scrollid生存時間
scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
// 7 執行查詢獲取返回結果
SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
// 8.判斷是否得到資料,輸出
if (scrollResp.getHits().getHits() != null && scrollResp.getHits().getHits().length > 0){
System.out.println("=======下一頁的資料========");
for (SearchHit hit : scrollResp.getHits().getHits()){
System.out.println(hit.getSourceAsMap());
}
}else{
// 9。判斷沒有查詢到資料-退出迴圈
System.out.println("沒得");
break;
}
}
// 10 建立clearScrollRequest
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
// 11 指定scrollid
clearScrollRequest.addScrollId(scrollId);
// 12 刪除
client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
}
4.5 delete-by-query
根據term,match等查詢方式去刪除大量的文件
如果你需要刪除的內容,是index下的大部分資料,不建議使用,建議逆向操作,建立新的索引,新增需要保留的資料內容
POST /sms_logs_index/sms_logs_type/_delete_by_query
{
"query": {
"range": {
"relyTotal": {
"gte": 2,
"lte": 3
}
}
}
}
##中間跟你的查詢條件,查到什麼,刪什麼t
public class test_sms_search2 {
String index = "sms_logs_index";
String type = "sms_logs_type";
@Test
public void test_query_fuzzy() throws IOException {
DeleteByQueryRequest request = new DeleteByQueryRequest(index);
request.types(type);
request.setQuery(QueryBuilders.rangeQuery("relyTotal").gt("2").lt("3"));
RestHighLevelClient client = ESClient.getClient();
BulkByScrollResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
}
}
4.6 複合查詢
4.6. 1 bool查詢
複合過濾器,可以將多個查詢條件以一定的邏輯組合在一起,and or
-
must : 所有的條件,用must組合在一起,表示AND
-
must_not:將must_not中的條件,全部不能匹配,表示not的意思,不能匹配該查詢條件
-
should: 所有條件,用should組合在一起,表示or的意思,文件必須匹配一個或者多個查詢條件
-
filter: 過濾器,文件必須匹配該過濾條件,跟must子句的唯一區別是,filter不影響查詢的score
#查詢省份為河北或者河南的
#並且公司名不是河馬生鮮的
#並且smsContext中包含軟體兩個字
POST /sms_logs_index/sms_logs_type/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"province": {
"value": "河北"
}
}
},
{
"term": {
"province": {
"value": "河南"
}
}
],
"must_not": [
{
"term": {
"corpName": {
"value": "河馬生鮮"
}
}
}
],
"must": [
{
"match": {
"smsContext": "軟體"
}
}
]
}
}
}