Q1:==springboot項目,如何使用elasticsearch的api增刪改查?查詢中有哪些方式,如果模糊查詢、排序查詢、分頁查詢?分別闡述下這些查詢方式的用法?最後舉一個完整的例子== 答: 在Spring Boot項目中使用Elasticsearch的API增刪改查,需要引入spring ...
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中儲存並查詢複雜的嵌套結構數據。