Java elasticSearch-api的具體操作步驟講解
使用步驟
1.環(huán)境準(zhǔn)備
用的是windows版,自行下載
鏈接: 下載地址
2.針對索引操作
這里是kibana上操作的(也可以用postman操作):

#創(chuàng)建索引,指定文檔id
PUT /test1/type1/1
{
"name":"張三",
"age":30
}
#創(chuàng)建索引規(guī)則(類似數(shù)據(jù)庫建表)
PUT /test2
{
"mappings": {
"properties": {
"name":{
"type":"text"
},
"age":{
"type": "integer"
},
"birthday":{
"type": "date"
}
}
}
}
#獲取索引的信息,properties類型
GET test2
#創(chuàng)建索引,properties不指定類型會有默認(rèn)類型
#也可以用作修改,但是必須寫上全部字段,不然會丟失未寫字段
PUT /test3/_doc/1
{
"name":"張三",
"age":30,
"birth":"1991-06-23"
}
GET test3
#查看es健康狀態(tài)
GET _cat/health
#查看所有索引狀態(tài)
GET _cat/indices?v
#修改
POST /test3/_doc/1/_update
{
"doc":{
"name":"李四"
}
}
3.針對doc操作(增刪改)
代碼如下(示例):
#新增索引,并添加doc
POST /chen/user/1
{
"name":"張三",
"age":11,
"desc":"一頓操作猛如虎,一看工資2500",
"tags":["技術(shù)宅","溫暖","直男"]
}
POST /chen/user/2
{
"name":"李四",
"age":12,
"desc":"憨批",
"tags":["渣男","旅游","交友"]
}
POST /chen/user/3
{
"name":"王五",
"age":13,
"desc":"瓜慫",
"tags":["靚女","旅游","美食"]
}
POST /chen/user/4
{
"name":"劉六",
"age":14,
"desc":"鍋盔",
"tags":["衰仔","旅游","美食"]
}
#獲取數(shù)據(jù)
GET chen/user/1
#更新數(shù)據(jù)
POST chen/user/1/_update
{
"doc":{
"name":"更新"
}
}
#刪除
DELETE chen/user/1
#條件查詢,匹配度越高,_score(分值)越高
GET chen/user/_search?q=name:李
GET chen/user/_search?q=name:李四
#等價于上面
GET chen/user/_search
{
"query": {
"match": {
"name": "李四"
}
}
}
4.針對doc操作(查)
查詢1(示例):
#_source結(jié)果過濾(指定需要字段結(jié)果集)
#sort排序
#from-size分頁(類似limit )
#注意:這個查詢是不可以些多個字段的(我試過了)
GET chen/user/_search
{
"query": {
"match": {
"name": "李四"
}
},
"_source": ["name","age"],
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from":0,
"size":1
}
#多條件精確查詢
#以下都是bool的二級屬性
#must:必須
#should,滿足任意條件
#must_not,表示不滿足
GET chen/user/_search
{
"query": {
"bool": {
"must": [
{"match": {
"name": "李四"
}},
{"match": {
"age": 11
}}
]
}
}
}
#過濾.注意filter是bool(多條件)的二級屬性
GET chen/user/_search
{
"query": {
"bool": {
"must": [
{"match": {
"name": "李四"
}}
],
"filter": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
}
}
#分詞器依然有效
#多個條件空格隔開就行,只要滿足其中一個,就會被逮到
GET chen/user/_search
{
"query": {
"match": {
"tags": "男 技術(shù)"
}
}
}
#精確查詢,結(jié)果只能為1,多條直接不顯示
GET chen/user/_search
{
"query": {
"term": {
"name": "李四"
}
}
}
查詢2(示例):
#新建索引
PUT test4
{
"mappings": {
"properties": {
"name":{
"type": "text"
},
"desc":{
"type": "keyword"
}
}
}
}
#插入數(shù)據(jù)
PUT test4/_doc/1
{
"name":"張三name",
"desc":"張三desc"
}
PUT test4/_doc/2
{
"name":"張三name2",
"desc":"張三desc2"
}
#分詞器查詢(并不是查詢索引里的數(shù)據(jù),而是將text的內(nèi)容用分詞器拆分的結(jié)果)
GET _analyze
{
"analyzer": "keyword",
"text": ["張三name"]
}
GET _analyze
{
"analyzer": "standard",
"text": "張三name"
}
GET test4/_search
{
"query": {
"term": {
"name": "張"
}
}
}
#==keyword不會被分詞器解析==
GET test4/_search
{
"query": {
"term": {
"desc": "張三desc"
}
}
}
查詢3(示例):
PUT test4/_doc/3
{
"t1":"22",
"t2":"2020-4-6"
}
PUT test4/_doc/4
{
"t1":"33",
"t2":"2020-4-7"
}
#精確查詢多個值
GET test4/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"t1": "22"
}
},
{
"term": {
"t1": "33"
}
}
]
}
}
}
#highlight:高亮
#pre_tags,post_tags:自定義高亮條件,前綴后綴
GET chen/user/_search
{
"query": {
"match": {
"name": "李四"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'",
"post_tags": "</p>",
"fields": {
"name":{}
}
}
}
5.java-api
索引操作:
public class ES_Index {
private static final String HOST_NAME = "localhost";
private static final Integer PORT = 9200;
private static RestHighLevelClient client;
//創(chuàng)建ES客戶端
static {
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(HOST_NAME, PORT));
client = new RestHighLevelClient(restClientBuilder);
}
//關(guān)閉ES客戶端
public void close() {
if (null != client) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//創(chuàng)建索引
public void addIndex() throws IOException {
//創(chuàng)建索引
CreateIndexRequest request = new CreateIndexRequest("chen");
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
//響應(yīng)狀態(tài)
System.out.println("索引創(chuàng)建操作: " + response.isAcknowledged());
}
//查詢索引
public void selectIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("chen");
GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
System.out.println("索引查詢操作: " +response.getAliases());
System.out.println("索引查詢操作: " +response.getMappings());
System.out.println("索引查詢操作: " +response.getSettings());
}
//刪除索引
public void deleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("chen");
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println("索引刪除操作: "+response.isAcknowledged());
}
public static void main(String[] args) throws IOException {
ES_Index index=new ES_Index();
//index.addIndex();
//index.selectIndex();
index.deleteIndex();
index.close();
}
}
文檔操作:
public class ES_Doc {
private static final String HOST_NAME = "localhost";
private static final Integer PORT = 9200;
private static RestHighLevelClient client;
//創(chuàng)建ES客戶端
static {
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(HOST_NAME, PORT));
client = new RestHighLevelClient(restClientBuilder);
}
//關(guān)閉ES客戶端
public void close() {
if (null != client) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//插入數(shù)據(jù)
public void addDoc() throws IOException {
IndexRequest request = new IndexRequest();
User user = new User("張三", "男", 18);
//向es插入數(shù)據(jù),必須將數(shù)據(jù)轉(zhuǎn)換為json格式
String userJson = new ObjectMapper().writeValueAsString(user);
request.index("user").id("1001").source(userJson, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println("文檔創(chuàng)建操作: " + response.getResult());
}
//修改數(shù)據(jù)(局部修改)
public void updateDoc() throws IOException {
UpdateRequest request = new UpdateRequest();
request.index("user").id("1001").doc(XContentType.JSON, "sex", "女");
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("文檔修改操作: " + response.getResult());
}
//獲取數(shù)據(jù)
public void getDoc() throws IOException {
GetRequest request = new GetRequest();
request.index("user").id("1001");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
User user = new ObjectMapper().readValue(response.getSourceAsString(), User.class);
System.out.println("文檔獲取操作: " + user);
}
//刪除數(shù)據(jù)
public void deleteDoc() throws IOException {
DeleteRequest request = new DeleteRequest();
request.index("user").id("1001");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println("文檔刪除操作: " + response.getResult());
}
//批量插入數(shù)據(jù)
public void addBatch() throws IOException {
BulkRequest request = new BulkRequest();
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "張三", "sex", "男", "age", 10));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "李四", "sex", "男", "age", 20));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "王五", "sex", "女", "age", 30));
request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "趙六", "sex", "男", "age", 40));
request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "孫七", "sex", "女", "age", 50));
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
System.out.println("文檔批量新增操作: " + response.getTook());
System.out.println("文檔批量新增操作: " + !response.hasFailures());//是否失敗
}
//批量刪除數(shù)據(jù)
public void deleteBatch() throws IOException {
BulkRequest request = new BulkRequest();
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
request.add(new DeleteRequest().index("user").id("1004"));
request.add(new DeleteRequest().index("user").id("1005"));
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
System.out.println("文檔批量刪除操作: " + response.getTook());
System.out.println("文檔批量刪除操作: " + !response.hasFailures());//是否失敗
}
//查詢(重點)
public void searchDoc() throws IOException {
SearchRequest request = new SearchRequest();
request.indices("user");
//1.查詢索引中的全部數(shù)據(jù)
//request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
//2.查詢年齡為30的數(shù)據(jù)
//request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
//3.分頁查詢,當(dāng)前第0頁,每頁兩條
//request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).from(0).size(2));
//4.排序,倒序
//request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).sort("age", SortOrder.DESC));
//5.過濾字段(排除和包含,也可以是數(shù)組)
//request.source(new SearchSourceBuilder().fetchSource("name", null));
//6.組合查詢
//BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//6.1 must相當(dāng)于and
//boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
//boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "女"));
//6.2 should相當(dāng)于or
//boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
//boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "女"));
//request.source(new SearchSourceBuilder().query(boolQueryBuilder));
//7.范圍查詢
//request.source(new SearchSourceBuilder().query(QueryBuilders.rangeQuery("age").gte(30).lte(40)));
//8.模糊查詢Fuzziness.ONE即只差1個字符
//request.source(new SearchSourceBuilder().query(QueryBuilders.fuzzyQuery("name", "王五").fuzziness(Fuzziness.ONE)));
//9.高亮顯示
//SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchPhraseQuery("name", "張三"));
//builder.highlighter(new HighlightBuilder().preTags("<font color='red'>").postTags("</font>").field("name"));
//request.source(builder);
//10.聚合查詢
//SearchSourceBuilder builder = new SearchSourceBuilder();
//MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
//builder.aggregation(aggregationBuilder);
//request.source(builder);
//11.分組查詢
SearchSourceBuilder builder = new SearchSourceBuilder();
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(aggregationBuilder);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();
System.out.println("--條數(shù): " + hits.getTotalHits());
System.out.println("--用時: " + response.getTook());
hits.forEach((item)->{
System.out.println("--數(shù)據(jù): " + item.getSourceAsString());
});
}
public static void main(String[] args) throws IOException {
ES_Doc doc = new ES_Doc();
//doc.addDoc();
//doc.updateDoc();
//doc.getDoc();
//doc.deleteDoc();
//doc.addBatch();
//doc.deleteBatch();
doc.searchDoc();
doc.close();
}
}
6.spring-data-elasticsearch
實體類: 關(guān)鍵在于@Document和@Field注解
shards 代表分片
replicas 代表副本
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "product", shards = 3, replicas = 1)
public class Product {
@Id
private Long id;//商品唯一標(biāo)識
@Field(type = FieldType.Text)
private String title;//商品名稱
@Field(type = FieldType.Keyword)
private String category;//分類名稱
@Field(type = FieldType.Double)
private Double price;//商品價格
@Field(type = FieldType.Keyword,index = false)
private String images;//圖片地址
}
dao層: 這樣就已經(jīng)可以了,類似mybatis-plus的BaseMapper,封裝好了一些操作
@Repository
public interface ProductDao extends ElasticsearchRepository<Product,Long> {
}
yaml :不用怎么配置,默認(rèn)就去找localhost:9200
測試 :不知道為啥dao的很多方法都過時了,看源碼注釋讓回去用elasticsearchRestTemplate,感覺更繁瑣
@SpringBootTest
class ElasticsearchApplicationTests {
@Autowired
ElasticsearchRestTemplate elasticsearchRestTemplate;
@Autowired
ProductDao productDao;
@Test
void createIndex() {
//創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引
System.out.println("創(chuàng)建索引");
}
@Test
void deleteIndex() {
//創(chuàng)建索引,系統(tǒng)初始化會自動創(chuàng)建索引
boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class);
System.out.println("刪除索引 = " + flg);
}
//新增數(shù)據(jù)
@Test
void addDoc() {
Product product = new Product();
product.setId(1001L);
product.setTitle("華為手機");
product.setCategory("手機");
product.setPrice(2999.0);
product.setImages("www.huawei.com");
productDao.save(product);
}
//修改
@Test
void updateDoc() {
Product product = new Product();
product.setId(1001L);
product.setTitle("小米手機");
product.setCategory("手機");
product.setPrice(4999.0);
product.setImages("www.xiaomi.com");
productDao.save(product);
}
//根據(jù) id 查詢
@Test
void findById() {
Product product = productDao.findById(1001L).get();
System.out.println(product);
}
//查詢所有
@Test
void findAll() {
Iterable<Product> products = productDao.findAll();
for (Product product : products) {
System.out.println(product);
}
}
//刪除
@Test
public void delete() {
productDao.deleteById(1001L);
}
//批量新增
@Test
public void saveAll() {
List<Product> productList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Product product = new Product();
product.setId((long) i);
product.setTitle("[" + i + "]小米手機");
product.setCategory("手機");
product.setPrice(1999.0 + i);
product.setImages("http://www.atguigu/xm.jpg");
productList.add(product);
}
productDao.saveAll(productList);
}
//分頁查詢
@Test
void findByPageable() {
Sort orders = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(0, 5, orders);
Page<Product> products = productDao.findAll(pageable);
products.forEach(System.out::println);
}
/**
* term 查詢
* search(termQueryBuilder) 調(diào)用搜索方法,參數(shù)查詢構(gòu)建器對象
*/
@Test
void termQuery() {
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手機");
Iterable<Product> products = productDao.search(termQueryBuilder);
products.forEach(System.out::println);
}
/**
* term 查詢加分頁
*/
@Test
void termQueryByPage() {
PageRequest pageRequest = PageRequest.of(0, 5);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "手機");
Iterable<Product> products = productDao.search(termQueryBuilder, pageRequest);
products.forEach(System.out::println);
}
}
到此這篇關(guān)于elasticSearch-api的具體操作步驟講解的文章就介紹到這了,更多相關(guān)elasticSearch-api詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nacos docker單機模式部署實現(xiàn)過程詳解
這篇文章主要介紹了Nacos docker單機模式部署實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
IDEA導(dǎo)入Eclipse項目的方法步驟(圖文教程)
這篇文章主要介紹了IDEA導(dǎo)入Eclipse項目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法
這篇文章主要介紹了將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法,有需要的朋友可以參考一下2014-01-01
java如何實現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請求
在Java開發(fā)中,模擬Postman發(fā)送x-www-form-urlencoded類型的請求是一個常見需求,本文主要介紹了如何在Java中實現(xiàn)這一功能,首先,需要通過導(dǎo)入http-client包來創(chuàng)建HTTP客戶端,接著,利用該客戶端發(fā)送Post請求2024-09-09
Java Web監(jiān)聽器如何實現(xiàn)定時發(fā)送郵件
這篇文章主要介紹了Java Web監(jiān)聽器如何實現(xiàn)定時發(fā)送郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12
Springboot FeignClient調(diào)用Method has too m
本文主要介紹了Springboot FeignClient微服務(wù)間調(diào)用Method has too many Body parameters 解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
使用springboot開發(fā)的第一個web入門程序的實現(xiàn)
這篇文章主要介紹了使用springboot開發(fā)的第一個web入門程序的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

