ElasticSearch
1. ElasticSerch簡介:
全文搜索屬于最常見的需求,開源的 Elasticsearch 是目前全文搜索引擎的首選, 它可以快速地儲存、搜索和分析海量資料,維基百科、Stack Overflow、Github 都采用它 Elastic 的底層是開源庫 Lucene,但是,你沒法直接用 Lucene,必須自己寫代碼去呼叫它的 介面,Elastic 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用, REST API:天然的跨平臺,
官方檔案:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
社區中文: https://es.xiaoleilu.com/index.html http://doc.codingdict.com/elasticsearch/0
2. 相關概念
2.1 Index(索引)
動詞,相當于 MySQL 中的 insert; 名詞,相當于 MySQL 中的 Database
2.2 Type(型別)
在 Index(索引)中,可以定義一個或多個型別, 類似于 MySQL 中的 Table;每一種型別的資料放在一起;
2.3 Document(檔案)
保存在某個索引(Index)下,某種型別(Type)的一個資料(Document),檔案是 JSON 格 式的,Document t 就像是 MySQL 中的某個 Table 里面的內容,
2.4 倒排索引機制
倒排索引源于實際應用中需要根據屬性的值來查找記錄,lucene是基于倒排索引實作的,
簡單來說就是根據屬性值獲取索引值,
3. 安裝
使用docker安裝,同時需要安裝ElasticSearch和Kibana兩個鏡像,
更多詳情請參考官方檔案,
ElasticSearch符合RestFul風格
4. 基本操作
參考相關檔案
就像是使用RestFul的風格用url操縱資料庫,
5. 結合JAVA使用
5.1 引入相關依賴
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
5.2 撰寫配置類
//排除引入common工程的資料源依賴
//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("101.200.45.111", 9200, "http")));//需要填寫es所在服務器的域名以及埠號
return client;
}
}
5.3 創建索引(添加資料)
//存盤資料到es(添加更新二合一)
@Test
public void addIndex() throws Exception{
//(創建索引的請求指定索引名稱(users))
IndexRequest indexRequest = new IndexRequest("users");
//指定id
indexRequest.id("1");
//這種方法也可以 直接寫json字串
// indexRequest.source("username","zhansan","age",18,"gender","男");
User user =new User();
user.setUsername("戰三");
user.setGender("f");
user.setAge(123);
//將物件決議為JSON字串
String s = JSON.toJSONString(user);
indexRequest.source(s,XContentType.JSON);
//保存后拿到回應結果
IndexResponse index = restHighLevelClient.index(indexRequest,COMMON_OPTIONS);
System.out.println(index);
}
@Data
class User{
private String username;
private String gender;
private Integer age;
}
5.4 查詢
@Test
public void searchData() throws Exception {
//1.創建索引請求
SearchRequest searchRequest = new SearchRequest();
//2.指定索引
searchRequest.indices("xxx");
//3.指定DSL 檢索條件
//SearchSourceBuilder sourceBuilder(里面封裝的查詢條件)
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//3.1構建檢索條件
// searchSourceBuilder.query();
// searchSourceBuilder.from();
// searchSourceBuilder.size();
// searchSourceBuilder.aggregation();
searchSourceBuilder.query(QueryBuilders.matchQuery("field", "xxx"));
//創建聚合條件
//1.查看值分布聚合
TermsAggregationBuilder agg1 = AggregationBuilders.terms("Aggname").field("AggField").size(10);
//將聚合條件加入到查詢條件中
searchSourceBuilder.aggregation(agg1);
searchRequest.source(searchSourceBuilder);
//4.執行檢索 拿到資料
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//5.分析結果(Json串)
//獲取所有查到的資料
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String string = hit.getSourceAsString();
XXClass xxClass = JSON.parseObject(string,XXClass.class);
System.out.println("xxClass"+xxClass);
}
// }
//獲取檢索到的分析資訊
Aggregations aggregations = searchResponse.getAggregations();
Terms aggName = aggregations.get("AggName");
for (Terms.Bucket bucket : aggName.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年齡"+keyAsString+bucket.getDocCount());
}
}
6. 結合業務使用
6.1 創建微服務gulimall-search
相關的組態檔:
application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-search
server.port=12000
6.2 撰寫配置類
@Configuration
public class GulimallElasticSearchConfig {
//配置es請求OPTIONS
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
//配置es連接
@Bean
RestHighLevelClient client() {
RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.190.131", 9200, "http"));
return new RestHighLevelClient(builder);
}
}
6.3 Controller層
@RequestMapping("/search")
@RestController
@Slf4j
public class ElasticSaveController {
@Autowired
ProductSaveService productSaveService;
// 上架商品
@PostMapping("/product")
public R productStatusUp(@RequestBody List<SkuEsModel> skuEsModels) {
boolean flag = false;
try {
flag = productSaveService.productStatusUp(skuEsModels);
} catch (IOException e) {
log.error("ElasticSaveController商品上架錯誤: {}", e);
return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(), BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg());
}
if (flag) {
return R.ok();
} else {
return R.error(BizCodeEnume.PRODUCT_UP_EXCEPTION.getCode(), BizCodeEnume.PRODUCT_UP_EXCEPTION.getMsg());
}
}
}
6.4 Service層
注: 使用RestHighLevelClient
進行操作
@Slf4j
@Service
public class ProductSaveServiceImpl implements ProductSaveService {
@Autowired
RestHighLevelClient restHighLevelClient;
@Override
public boolean productStatusUp(List<SkuEsModel> skuEsModels) throws IOException {
// 保存到es中
//1、給es中建立索引,product,建立好映射關系,
//2、給es中保存這些資料
//BulkRequest bulkRequest, RequestOptions options
BulkRequest bulkRequest = new BulkRequest();
for (SkuEsModel model : skuEsModels) {
// 構造保存請求
IndexRequest indexRequest = new IndexRequest(EsConstant.PRODUCT_INDEX);
//指定資料id
indexRequest.id(model.getSkuId().toString());
//將要保存的資料物件轉換為JSON格式
String s = JSON.toJSONString(model);
//插入資料 并指明資料型別為JSON
indexRequest.source(s, XContentType.JSON);
//將保存請求(indexRequest)添加到批量保存請求中
bulkRequest.add(indexRequest);
}
//創建批量執行物件
//使用restHighLevelClient客戶端進行保存 拿到回應結果
//兩個引數 第一個是批量保存的請求 第二個是請求OPTIONS
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);
//分析保存結果
boolean b = bulk.hasFailures();
List<String> collect = Arrays.stream(bulk.getItems()).map(item -> {
return item.getId();
}).collect(Collectors.toList());
log.info("商品上架成功: {}", collect);
//回傳布爾型別的資料,如果是true就是有錯誤了,回傳false就是沒有錯誤
return b;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/420476.html
標籤:其他
下一篇:返回列表