和我一起打造個簡單搜索之SpringDataElasticSearch入門
網上大多通過 java 操作 es 使用的都是 TransportClient,而介紹使用 SpringDataElasticSearch 的文章相對比較少,筆者也是摸索了許久,接下來本文介紹 SpringDataElasticSearch 的 api 使用,更加方便的進行查詢。
系列文章
- 一、和我一起打造個簡單搜索之ElasticSearch集群搭建
- 二、和我一起打造個簡單搜索之ElasticSearch入門
- 三、和我一起打造個簡單搜索之IK分詞以及拼音分詞
- 四、和我一起打造個簡單搜索之Logstash實時同步建立索引
- 五、和我一起打造個簡單搜索之SpringDataElasticSearch入門
- 六、和我一起打造個簡單搜索之SpringDataElasticSearch關鍵詞高亮
- ...
環境依賴
本文以及後續 es 系列文章都基於 5.5.3 這個版本的 elasticsearch ,這個版本比較穩定,可以用於生產環境。
本文項目基於 SpringBoot 2.0.4.RELEASE 進行構建,首先引入 Spring Data ElasticSearch 的依賴。
註意:因為是 Spring Boot 項目,所以引入的依賴是 spring-boot-starter-data-elasticsearch,而不是直接引入 spring-data-elasticsearch。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
Spring Data ElasticSearch 與 ElasticSearch 有對應關系
spring data elasticsearch | elasticsearch |
---|---|
3.1.x | 6.2.2 |
3.0.x | 5.5.0 |
2.1.x | 2.4.0 |
2.0.x | 2.2.0 |
1.3.x | 1.5.2 |
而本文使用的 SpringBoot 2.0.4.RELEASE 自動依賴的 Spring Data ElasticSearch 版本是 3.0.9.RELEASE,對應的 elasticsearch 版本是 5.5.x,可知依賴是正確的版本。
創建 Document 類
@Data @Document(indexName = "novel", type = "book", createIndex = false) public class Book implements Serializable { private static final long serialVersionUID = 8504604495927552402L; /** * 需要添加 @Id 標識主鍵 */ @Id private Integer id; private Integer words; private String intro; private String name; private Integer sort; private Boolean vip; private Integer site; private String author; private Integer collection; private Integer click; private Integer popularity; private Integer goods; private Integer status; /** * 需要自定義時間格式化格式,否則會使用默認時間格式化 */ @JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss") private Date updatetime; }
這個 Document 類封裝了索引的全部字段信息,註意字段名稱要與索引類型的字段名稱一致。
創建 Repository 接口
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
}
用過 SpringDataJPA 的朋友都應該知道,ElasticsearchRepository 的兩個泛型分別為 Documet 以及 Document 的主鍵類型。
創建測試類
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class BookRepositoryTest {
@Autowired
private BookRepository bookRepository;
}
演示簡單查詢
匹配查詢(MatchQuery)
進行模糊匹配查詢,這裏演示的是通過 name 這個字段進行查詢
@Test
public void findBook() {
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "火爆娛樂天王");
bookRepository.search(matchQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
項查詢(TermQuery)
完全匹配查詢,這裏演示查詢 id 為 2 的數據
@Test
public void findBook() {
TermQueryBuilder termQuery = QueryBuilders.termQuery("id", 2);
bookRepository.search(termQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
範圍查詢(Range Query)
範圍查詢,這裏演示查詢字數在 0-30w 之間的作品
@Test
public void findBook() {
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("words").gt(0).lt(300000);
bookRepository.search(rangeQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
註意:如果對時間進行範圍查詢,註意不能傳遞 Date 對象或者 毫秒值,只能傳遞 yyyy-MM-dd HH:mm:ss 格式的字符串時間參數。
復合查詢
以上演示了幾個基本查詢,但是如果要實現多篩選條件的查詢,就需要把多個基本查詢進行組合,這裏就用到了 bool 查詢
現在來實現這個查詢
BookQuery 參數封裝
使用 BookQuery 類封裝查詢參數
@Data
public class BookQuery {
private String queryString;
private Integer page = 1;
private Integer size = 20;
private Integer wordsBegin;
private Integer wordsEnd;
private Integer sort;
private Boolean vip;
private Integer site;
private Integer collection;
private Integer click;
private Integer popularity;
private Integer goods;
private Integer status;
private Date updatetime;
}
查詢測試
@Test
public void findBook() {
BookQuery query = new BookQuery();
query.setQueryString("魔");
query.setSite(2);// 1 是男生 2 是女生
query.setSort(29); // 29 是玄幻
query.setVip(true);// 查詢 vip 作品
query.setWordsBegin(0); // 查詢字數在 0-25w 之間的作品
query.setWordsEnd(500000);
query.setPage(1);// 分頁頁碼
query.setSize(10);// 每頁顯示數
// 復合查詢
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 以下為查詢條件, 使用 must query 進行查詢組合
MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "name", "intro", "author");
boolQuery.must(matchQuery);
// 以下為過濾篩選條件,使用 filter 比使用 must query 性能要好
TermQueryBuilder siteQuery = QueryBuilders.termQuery("site", query.getSite());
boolQuery.filter(siteQuery);
TermQueryBuilder sortQuery = QueryBuilders.termQuery("sort", query.getSort());
boolQuery.filter(sortQuery);
TermQueryBuilder vipQuery = QueryBuilders.termQuery("vip", query.getVip());
boolQuery.filter(vipQuery);
RangeQueryBuilder wordsQuery = QueryBuilders.rangeQuery("words").gt(query.getWordsBegin()).lt(query.getWordsEnd());
boolQuery.filter(wordsQuery);
Sort sort = Sort.by(Sort.Direction.DESC, "click");
// 分頁 同時根據 點擊數 click 進行降序排列
PageRequest pageRequest = PageRequest.of(query.getPage() - 1, query.getSize(), sort);
log.info("{}", boolQuery);
bookRepository.search(boolQuery, pageRequest)
.forEach(e -> log.info("作品信息:{}", e));
}
查出結果:
2018-09-12 22:33:05.750 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=7, words=345004, intro= 推薦《尋龍傳》《魂攝天下》 作品屬玄幻異界大陸風格! 可惜頻道不能更改只能在奇幻混! 書友群:292... , name=滅魔成聖, sort=29, vip=true, site=2, author=等待瀟湘詩社, collection=13, click=63263, popularity=2314, goods=5353, status=0, updatetime=Tue Sep 04 16:54:15 CST 2018)
2018-09-12 22:33:05.751 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=9, words=233000, intro= 一名地球的平凡的少年,因為一場遊戲,獲得死神的傳承,從而穿越到另外一片陌生的大陸,從此開啟了一段傳奇的人生,九天星河,吾乃死神,掌控生死,判奪罪惡,我從沒見過地獄,因為我的名字,便代表地獄,吾乃死神,吾名林天。(PS:單女主,爽文不虐心,主角以殺證道,殺該殺之人,不聖母,略腹黑) 各位書友要是覺得《帶著死神去穿越》還不錯的話請不要忘記向您QQ群和微博裏的朋友推薦哦!帶著死神去穿越最新章節,帶著死神去穿越無彈窗,帶著死神去穿越全文閱讀. , name=帶著死神去穿越, sort=29, vip=true, site=2, author=夢侍, collection=6326, click=523, popularity=135, goods=34252, status=0, updatetime=Thu Dec 28 04:53:07 CST 2017)
2018-09-12 22:33:05.751 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=5, words=490000, intro= 富家子弟墨浞因為發現了村子中的秘密,在良心與親情的折磨下,逃到了邊境小城。因為一個香-艷而又恐怖的夢,墨浞經歷了一些詭異的事,從而得知自己的前世與今生的使命。踏上藏地,歷經磨難,克服了自己的心魔,戰勝了... , name=伏魔, sort=29, vip=true, site=2, author=一葉style, collection=526, click=9, popularity=41516, goods=7687, status=0, updatetime=Thu Sep 06 04:54:05 CST 2018)
最後
SpringDataElasticSearch 入門就到這裏了,是不是很簡單呢?
本文示例項目地址:https://github.com/Mosiki/SpringDataElasticSearchQuickStartExample
有疑問?
歡迎來信,給我寫信
參考
- https://blog.csdn.net/tianyaleixiaowu/article/details/77965257
- https://tech.youzan.com/search-engine1/#43filteredquery
和我一起打造個簡單搜索之SpringDataElasticSearch入門