記一次springboot+elasticsearch+mongodb查詢的使用

記一次springboot+elasticsearch+mongodb查詢的使用

  • springboot:2.3.5
  • es:7.10.1
  • mongodb:4.4x
  • elasticsearch部署:參考其他教程
  • 源數據:使用的mongodb,因爲mongodb查詢太慢所以使用es
  • elasticsearch同步mongodb數據:使用monstache
    – 注:由於資源有限,es和mongodb都放在同一臺服務器上了,所以monstache的es地址設置成http://127.0.0.1:9200,(一開始沒寫http導致一直報錯es服務器找不到node)部署在一臺服務器上其實沒什麼用,就是饞es的搜索功能。
  • 同步之後,服務器上啓動了mongodb和es服務
  • springboot項目中使用elasticsearch,參考其他教程
  • 官方文檔中推薦的是使用resthighlevelclient,這個的使用也有教程,但是參考官方文檔比較好,官方文檔對於hlc的講解也比較詳細
    –https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.10/java-rest-high-search.html
    –主要是構建query,client.search,再對searchResponse進行處理

  • 數據的對象處理參考其他教程
  • search之後得到map,轉化爲java對象使用到了jackson工具類(最開始想直接set屬性,但是map還得判斷是否爲null,之後使用阿里的fastjson但是效果一般,偶爾報錯,最後考慮jackson,確實nb)
  • 貼一段代碼,分享一下模糊查詢和匹配查詢
SearchRequest searchRequest = new SearchRequest("project.paper");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
       
       //分頁操作
        searchSourceBuilder.from(pagenum*20);
        searchSourceBuilder.size(20);
       
        //設置超時
        searchSourceBuilder.timeout(new TimeValue(30, TimeUnit.SECONDS));
        searchRequest.source(searchSourceBuilder);
       
        //構建一個querybuilder
        MatchQueryBuilder matchQueryBuilder = 
        new MatchQueryBuilder("authors.name", name).fuzziness(Fuzziness.AUTO).maxExpansions(3);
        searchSourceBuilder.query(matchQueryBuilder);
       
       //獲取response
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        return searchResponse;

我的理解是,querybuilder爲查詢的方式,即如何查詢

這裏的MatchQueryBuilder是模糊匹配查詢,用了ik分詞器後模糊粒度還是很大。

想要做到通過單詞“keyword”查詢到“a test keyword”這個字段的詞,還得用MatchPhraseBuilder,但是如果想要完全匹配,這個方法還是不行,因爲查詢的關鍵字只要屬於字段就會被返回。

實在想要實現精確匹配查詢,之後考慮了TermQueryBuilder,但是由於某種原因沒有成功返回數據,最後也沒有心情去追查原因。

最後實現了精確匹配,在用kibana玩耍的時候,發現es的數據中,每個字段有兩個值,比如之前代碼中的author.name,還存在另一個字段author.name.keyword,通過實踐發現用這個字段可以精確查詢,分詞器不會有影響。
kibana截圖

將之前的QueryBuilder的查詢字段改爲name.keyword

MatchPhraseQueryBuilder matchQueryBuilder = 
        new MatchPhraseQueryBuilder("authors.name.keyword", name);

具體原因暫時沒想要弄懂,不過這個keyword的效果應該和將字段的type變成keyword是一樣的,但是又想使用text的分詞功能,所以有點矛盾,至於換成MatchQuery之後效果是否一樣也沒時間探究了,但是精確查詢這一塊,查了很多教程也沒有什麼進展,最後偶然發現,還是很有感觸的。

  • 最後:es7.10教程還是很少,大多隻能參考官方文檔,好在這次只是使用了查詢功能,沒有很複雜,關於es多節點部署暫時沒有嘗試,只是想着先實現功能。
  • monstache參考:
    – https://blog.csdn.net/qq_28119741/article/details/109613212
    – 阿里雲文檔:https://help.aliyun.com/document_detail/171650.html

  • ✌🙄✌
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章