1. 程式人生 > >ElasticSearch 5.3 java Api(增刪改)使用

ElasticSearch 5.3 java Api(增刪改)使用

話不多說,環境是ElasticSearch 安裝教程 可以看這個。我的環境是5.3 + 分詞 。

一、Index的建立

      5.x的預設是不會在你插入資料的時候主動建立index的,所以網上其他地方的介紹程式碼,都有問題。你是沒法直接用的。
建立index:

     // 設定叢集名稱
    Settings settings = Settings.builder().put("cluster.name", clusterName).build();
    // 建立client
    client = new PreBuiltTransportClient(settings);
    Map<String, Integer> nodeMap = parseNodeIpInfo();
    for
(Map.Entry<String, Integer> entry : nodeMap.entrySet()) { client.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(entry.getKey()), entry.getValue())); } //建立client後,獲取index的配置引數 XContentBuilder mapping = getIndexMapping(); client.admin().indices().prepareCreate(userIndexName).setSettings(mapping).get(); /** * 解析節點IP資訊,多個節點用逗號隔開,IP和埠用冒號隔開 * @return
*/
private Map<String, Integer> parseNodeIpInfo() { String[] nodeIpInfoArr = esNodes.split(","); //esNodes為外部注入的es的ip Map<String, Integer> map = new HashMap<String, Integer>(nodeIpInfoArr.length); for (String ipInfo : nodeIpInfoArr) { String[] ipInfoArr = ipInfo.split(":"
); map.put(ipInfoArr[0], Integer.parseInt(ipInfoArr[1])); } return map; } /** * 建立所需的index配置 * @return * @throws IOException */ private XContentBuilder getIndexMapping() throws IOException { XContentBuilder mapping = XContentFactory.jsonBuilder(); mapping.startObject() .startObject("index") .startObject("analyzer") .startObject("pinyin_analyzer") .field("tokenizer", "my_pinyin") .endObject() .startObject("default") .field("tokenizer", "ik_max_word") .endObject() .endObject() .startObject("tokenizer") .startObject("my_pinyin") .field("type", "pinyin") // 拼音首字母單獨開一個 .field("keep_separate_first_letter", true) .field("keep_full_pinyin", true) .field("keep_original", true) .field("limit_first_letter_length", 16) .field("lowercase", true) .field("remove_duplicated_term", true) .endObject().endObject().endObject().endObject().endObject(); return mapping; } // 判斷index建立是否成功 IndicesExistsResponse userResponse = client.admin().indices().exists(new IndicesExistsRequest(userIndexName)).actionGet(); return userResponse.isExists(); //true 存在

二、建立type

      在ElasticSearch裡面,上面的index就相當於建立一個了一個數據庫,而type則是建立一張表。

    //es裡面設定引數的話用這個比較形象的去構建json格式
    XContentBuilder mapping = XContentFactory.jsonBuilder()
                .startObject()
                .startObject(userTypeName) //該type 名
                    .startObject("properties")  
                        .startObject("userId")  //相當於資料庫欄位名 型別
                            .field("type", "text")  //欄位型別
                        .endObject()
                        .startObject("loginName") // 巢狀物件欄位
                            .field("type", "keyword") //特殊設定,該欄位是拼音分詞的
                            .startObject("fields")
                                .startObject("pinyin")
                                    .field("type", "text")
                                    .field("store", false)
                                    .field("term_vector", "with_offsets")
                                    .field("analyzer", "pinyin_analyzer") 
                                    .field("boost", 10)
                                .endObject()
                            .endObject()
                        .endObject() //刪去了部分欄位
                        .startObject("orgId")
                            .field("type", "text")
                        .endObject()
                        .startObject("orgPath")
                            .field("type", "text")
                        .endObject()
                        .endObject().endObject().endObject();
        PutMappingRequest mappingRequest = Requests.putMappingRequest(userIndexName).type(userTypeName).source(mapping);
        client.admin().indices().putMapping(mappingRequest).actionGet();

//判斷type是否存在
TypesExistsRequest type = new TypesExistsRequest(new String[] { userIndexName }, userTypeName);
return client.admin().indices().typesExists(type).actionGet().isExists();

三、增

        向ElasticSearch裡面新增資料的話可以一個個插入也可以批量新增:

public void bulkSaveUserToES(List<UserESData> users) throws Exception {

    BulkRequestBuilder bulk = client.prepareBulk();
       //迴圈新增資料
        for (UserESData u : users) { 
            //這裡是用我資料庫裡面的id作為ElasticSearch的文件id
            bulk.add(client.prepareIndex(userIndexName, userTypeName, u.getUserId()).setSource(JSON.toJSONString(u),XContentType.JSON));
        }
        //執行
        bulk.execute().actionGet();
    }

單個數據儲存
public void saveUserESData(final UserESData user) throws Exception {
    client.prepareIndex(userIndexName, userTypeName, user.getUserId())
                    .setSource(JSON.toJSONString(user), XContentType.JSON).get();
}

四、改

        在這裡ElasticSearch提供多種方式用於定位要修改的資料:

//根據id修改
XContentBuilder builder = null;
    try {
        builder = XContentFactory.jsonBuilder()
                .startObject()
                    .field("userName", user.getUserName())
                    .field("orgId", user.getOrgId())
                    .field("orgPath", user.getOrgPath())
                .endObject();
    } catch (IOException e) {
        log.error("方法updateUserESData 再構造儲存物件時出錯!", e);
    }
                                                        //根據這個id
    client.prepareUpdate(userIndexName, userTypeName, user.getUserId()).setDoc(builder)
                    .get();

    //批量根據id更新
    BulkRequestBuilder bulk = client.prepareBulk();
        for (Entry<String, Object[]> info : userInfo.entrySet()) {
            bulk.add(client.prepareUpdate(userIndexName, userTypeName, info.getKey())
                    .setDoc(XContentFactory.jsonBuilder()
                            .startObject()
                                .field("orgId", info.getValue()[0])
                                .field("orgPath", info.getValue()[1])
                                .field("teamId", info.getValue()[2])
                            .endObject()));
                }
    //執行
    bulk.execute().get();    

若是根據某些條件更新,可以使用ElasticSearch的指令碼 Painless
對於我們在ElasticSearch裡面的每一行資料(文件)都相當於 “ctx“ 資料的屬性是可以訪問的
ElasticSearch資料圖
如上邊的圖,我點選一行資料可以看到很多屬性。我使用ctx._source.userId 就可以獲取該userId
在程式裡:

//使用ElasticSearch的script來存放指令碼 , 讓userName修改為newName
Script script = new Script("ctx._source.userName=" + newName);
//建立更新的條件,假如是orgPath要能滿足orgInfo[0]這個條件的,就修改userName
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.should(QueryBuilders.matchPhraseQuery("orgPath", orgInfo[0]));
//執行
UpdateByQueryAction.INSTANCE.newRequestBuilder(client).script(script).filter(boolQuery)
                        .source(orgIndexName).get();

//該段程式碼相當於sql

UPDATE table SET userName = ? WHERE orgPath LIKE ? 

如果條件有多個比如:UPDATE table SET userName = ? WHERE orgPath LIKE ? AND userName LIKE ? 
script 不用變,
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.should(QueryBuilders.matchPhraseQuery("orgPath", orgInfo[0]));
boolQuery.must(QueryBuilders.matchPhraseQuery("userName", "陳"));

//如果希望修改路徑(字串)的部分值,那麼參照Painless 的白名單API 可以這樣編寫指令碼
StringBuilder sb = new StringBuilder(); 
sb.append("if(ctx._source.orgPath.startsWith(\"").append(oldOrgPath)
    .append("\")){ctx._source.orgPath=ctx._source.orgPath.replace(\"")
    .append(oldOrgPath).append("\",\"").append(newOrgPath)
    .append("\")}");
Script script = new Script(sb.toString());
/**  如果是以oldOrgPath開頭的路徑,則替換為newOrgPath  
if(ctx._source.orgPath.startsWith(oldOrgPath)){
    ctx._source.orgPath = ctx._source.orgPath.replace(oldOrgPath,newOrgPath)
}
*/

五、刪除

        ElasticSearch的刪除

//根據id刪除
client.prepareDelete(userIndexName, userTypeName, userId).execute().actionGet();

//根據條件來刪除  返回刪除條數   queryBuilder  構建的查詢條件

long delete = DeleteByQueryAction.INSTANCE.newRequestBuilder(client).filter(queryBuilder).source(userIndexName).get().getDeleted(); 

相關推薦

ElasticSearch 5.3 java Api刪改使用

話不多說,環境是ElasticSearch 安裝教程 可以看這個。我的環境是5.3 + 分詞 。 一、Index的建立       5.x的預設是不會在你插入資料的時候主動建立index的,所以網上其他地方的介紹程式碼,都有問題。你是沒法直接用的。 建

ElasticSearch 5.3 java API 查詢

關於ElasticSearch的index建立在這裡已經介紹了。 根據id查詢資料: //根據id查詢的話使用IdsQueryBuilder來新增id IdsQueryBuilder query

HBase--通過Java API與HBase互動刪改

import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop

3——字串型別刪改

字串 增 查 st.find(字元,StartIndex,EndIndex) # 返回查詢到的字串的索引位置,如果未找到將返回-1 st.count(字元) # 返回查詢並統計這個字串的數量 st.index(字元) # 返回查詢的字串的索引位置,如果未找到將報錯,推薦使用str.find

HBASE 使用java api 實現刪改查例項

我們使用windows 本地myeclipse測試程式,具體搭建教程請看首先建立maven 專案,並修改pom.xml,匯入hbase 第三方jar包,首次會自動下載<dependency> <groupId>org.apache.hbas

Elasticsearch 5.x Java api Aggregations(聚合)

  Ealsticsearch 5.x Java API聚合string型別的時候,會報錯(json的錯),則需要在聚合的string型別欄位的後面新增.keyword , 雖然使用watch檢視聚合的es json的時候會出現以下報錯,但是不會影響結果。 { "erro

圖書管理系統刪改

分享 bootstra url jquery .cn 添加 啟動 管理 bootstrap 圖書管理系統半成: 數據庫配置,urls配置,views配置,前端頁面配置,setting配置 先來一張簡單的配置圖: setting數據庫配置: 前端頁面編寫(h5,boots

Java API常用類

(一)Java API概述         Java API(Java Application Programming Interface,Java應用程式介面),是Java語言提供的組織成包結構的許多類和接 口的集合。Java API為使用者編寫應用

Java APIString類

概述String類裡一些常用的方法        1.String類           用於描述字串事物,提供了多個對字串進行操所的字串。列舉常見的操作:             1.獲取。                   1.1字串中包含的字元數,返回此字串的長度。

arcengine 連線sde,並對sde內資料進行管理刪改

1、連線sde,用的是連線檔案,怎麼建立連線檔案,arcgis 工具箱, 如果service引數使用的預設的埠號5151,則必須在建立連線檔案之前必須建立和開啟sde服務,而如果使用sde:sqlserver:ip地址或計算機名,則不需要建立和開啟服務。 locati

練習5-3 數字金字塔15 分

本題要求實現函式輸出n行數字金字塔。 函式介面定義: void pyramid( int n ); 其中n是使用者傳入的引數,為[1, 9]的正整數。要求函式按照如樣例所示的格式打印出n行數字金字塔。注 意每個數字後面跟一個空格。 裁判測試程式樣例: #incl

Java通過mongo-java-driver-3.0+操作mongodb資料庫刪改

本文以mongo-java-driver-3.5.0.jar為例 1 需要的jar包:https://pan.baidu.com/s/1jI3kB9W 密碼:79hv mongo-java-driver-3.5.0.jar junit-4.9.jar 2

elasticsearch java 基於TransportClient API刪改

返回客戶端類(基於TransportClient) @Configuration("meta") public class ConfigBeans { @Value("${es_name}") private String es_name; @V

Java的動態數組:ArrayList的簡單運用刪改

ArrayList的使用 Java的動態數組 ArrayList 小夥伴們!今天做個筆記分享給大家!這個是我創建的QQ交流群:315677448感興趣的歡迎你的加入。廢話不多說直接進入今天的主體ArrayList就是傳說中的動態數組!咱們創建一個Test類,具體代碼如下:package Case0

Java Web--刪改查之二介面後臺java程式碼轉載參考

/**  *   */ /**  * @author Administrator  *  */ package dao; import java.sql.*; public

java+SQL做學生資訊管理系統刪改學生新作

java+SQL做學生資訊管理系統(增刪改查) 過程中需要用到的所有工具資料庫以及資料庫管理器等等 密碼:q80t 大學學習java後做的第一個小專案忍不住分享一下,也是我自己的面向物件程式設計的實踐作業啦,有點水,不是很優。廢話不多數,下面進入正題 介面的編

solr 7.31版本window系統全程安裝搭建,涵蓋專案用到的大部分配置,常用查詢,solr多條件查詢、排序,配置資料庫,定時同步,全量與增量更新,使用solrJ在java程式進行刪改

前言:由於專案最近在做淘寶客商品資訊查詢這一塊,做搜尋引擎,離不開全文搜尋伺服器,我這裡選擇了solr。solr的好處可以自行百科,這裡主要是講解技術。這篇文章主要講解window的安裝和使用。若大家感興趣或者專案用到,希望你能跟著我的步驟進行下去,如果遇到問題,可以後續看下我在最底下的問題

MongoDBjava操作mongodb刪改

    java操作mysql資料庫的程式碼我們已經瞭如指掌了,增刪改查,java對mongodb資料庫也是類似的操作,先是資料庫連線,再是進行操作。     首先我們進入進入admin資料庫,然後建立自己的資料庫testMongoDb,進入admin資料庫後,就可以直

java實現對MongoDB的基本操作刪改

準備工作:要想用java實現對MongoDB的增刪改查,首先需要下載mongo的java驅動,mongo-java-driver-3.2.2, 下載地址:https://oss.sonatype.org/content/repositories/releases/org/m

ElasticSearch搜尋引擎一:es安裝及刪改

ElasticSearch下載地址:https://www.elastic.co/cn/downloads/elasticsearch es是一個使用java編寫的開源專案,所以需要jdk環境支援(且jdk版本須在1.8以上),安裝方式簡單粗暴,通過上方地址下載完壓縮包後直接解壓,進入bin目錄