Q1:springboot專案,如何使用elasticsearch的api增刪改查?查詢中有哪些方式,如果模糊查詢、排序查詢、分頁查詢?分別闡述下這些查詢方式的用法?最后舉一個完整的例子
答:
在Spring Boot專案中使用Elasticsearch的API增刪改查,需要引入spring-boot-starter-data-elasticsearch依賴,該依賴會給我們提供基本的Elasticsearch操作,例如使用ElasticsearchRestTemplate進行增刪改查操作,
使用ElasticsearchRestTemplate進行查詢操作,我們可以通過NativeSearchQueryBuilder組裝查詢的條件,查詢可以使用如下幾種方式:
- Term查詢:用于匹配精確的值,不進行分詞
QueryBuilder queryBuilder = QueryBuilders.termQuery("field", "value");
- Match查詢:用于根據分詞查詢
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
- Bool查詢:用于多條件查詢
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("field1", "value1"))
.must(QueryBuilders.matchQuery("field2", "value2"));
常見的查詢操作,包括模糊查詢、排序查詢、分頁查詢,我們可以通過在構建查詢條件時,分別加入相應的條件來實作,
- 模糊查詢
模糊查詢需要使用wildcardQuery或fuzzyQuery,其中,wildcardQuery是基于通配符的模糊查詢,而fuzzyQuery則是基于編輯距離的模糊查詢,
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("field", "value*");
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("field", "value");
- 排序查詢
排序查詢需要使用SortBuilder進行排序設定,排序欄位需要在mapping設定,
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withSort(SortBuilders.fieldSort("field").order(SortOrder.ASC));
- 分頁查詢
分頁查詢需要使用PageRequest對分頁引數進行設定,然后傳遞給ElasticsearchRestTemplate進行查詢,
PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
searchQueryBuilder.withPageable(pageRequest);
我們來看一個完整的示例,以模糊查詢、排序查詢、分頁查詢為例:
@Autowired
private ElasticsearchRestTemplate restTemplate;
public Page<Book> searchBooks(String keyword, int pageNumber, int pageSize) {
// 構建查詢條件
QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("name", "*"+keyword+"*");
NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder();
// 使用查詢條件
searchQueryBuilder.withQuery(queryBuilder);
// 分頁
PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
searchQueryBuilder.withPageable(pageRequest);
// 排序
searchQueryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
NativeSearchQuery searchQuery = searchQueryBuilder.build();
SearchHits<Book> searchHits = restTemplate.search(searchQuery, Book.class);
return searchHits.map(SearchHit::getContent);
}
其中,定義了一個Book物體類,包含id、name、price三個屬性,searchBooks方法使用wildcardQuery實作模糊查詢,使用PageRequest實作分頁查詢,使用fieldSort實作排序查詢,最后使用ElasticsearchRestTemplate執行查詢,并回傳查詢結果,
Q2:elasticsearch中儲存的復雜的資料機構是怎么樣的,舉個復雜結構的例子?
答:
在Elasticsearch中Elasticsearch是基于Lucene的搜索引擎,支持嵌套的復雜結構,在Elasticsearch中,復雜資料結構以檔案(Document)的方式儲存,每個檔案都由多個欄位(Field)組成,每個欄位可以是基本資料型別,也可以是物件型別,內部嵌套的物件型別被稱為嵌套型別(Nested Type),
下面是一個復雜結構的檔案示例,它表示一個學生的資訊,包括姓名、年齡、性別、所在學校、所在班級、選修的科目、成績等資訊,
{
"name": "小明",
"age": 18,
"gender": "male",
"school": {
"name": "清華大學",
"address": "北京市海淀區",
"country": "中國"
},
"class": {
"name": "高三(1)班",
"teachers": ["李老師", "張老師"],
"students": [
{
"name": "小明",
"age": 18,
"gender": "male"
},
{
"name": "小紅",
"age": 17,
"gender": "female"
},
{
"name": "小剛",
"age": 18,
"gender": "male"
}
]
},
"courses": [
{
"name": "語文",
"teacher": "張老師",
"score": 90
},
{
"name": "數學",
"teacher": "李老師",
"score": 85
},
{
"name": "英語",
"teacher": "王老師",
"score": 92
}
]
}
可以看到,該檔案中有嵌套的物件型別,包括school和class,class中又包括了一個嵌套的物件型別students,以及一個嵌套的簡單資料型別teachers,courses是一個陣列型別,包括多個嵌套的物件型別,
在Elasticsearch中,可以通過Mapping來指定檔案中的欄位型別和屬性,對于嵌套型別,需要額外指定nested屬性,才能支持嵌套查詢,
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"gender": {
"type": "keyword"
},
"school": {
"type": "object",
"properties": {
"name": {
"type": "text"
},
"address": {
"type": "text"
},
"country": {
"type": "keyword"
}
}
},
"class": {
"type": "object",
"properties": {
"name": {
"type": "text"
},
"teachers": {
"type": "keyword"
},
"students": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"gender": {
"type": "keyword"
}
}
}
}
},
"courses": {
"type": "nested",
"properties": {
"name": {
"type": "text"
},
"teacher": {
"type": "keyword"
},
"score": {
"type": "integer"
}
}
}
}
}
}
通過這樣的Mapping,就能在Elasticsearch中儲存并查詢復雜的嵌套結構資料,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/549702.html
標籤:NoSQL
上一篇:sql 截取表中指定欄位
