一、 constant Querygit
該查詢可以包含一個查詢或過濾器,經過該方式將返回的文檔的score設置爲1, 而後經過設置boost來提升當前查詢的權重(官方文檔說返回的score和boost相等), 提升該查詢的相關度網絡
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "酒")).boost(2f)) .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "店")).boost(1f))
應用場景(來源網絡): 好比匹配酒店設備:多個term 泳池,花園,wifi 好比咱們要將泳池的的分值放大,則將泳池的term經過該方式包一下,並設置一個你認爲合理的權重,提升泳池在酒店匹配過程的佔比。ui
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "泳池")).boost(2f)) .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "花園")).boost(1f)) .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "wifi")).boost(1f))
二、bool query
一種複合查詢,三種邏輯關係以下 must: AND
must_not:NOT should:OR 複合查詢: cityCode="chongqing_city" 而且 hotelName="hotel22"code
QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("cityCode","chongqing_city")).must(QueryBuilders.matchQuery("hotelName", "hotel22"))
三、 Dis Max Query索引
將子查詢union 到一塊兒,沒個文檔的分數是 子查詢中相同文檔的得分最大值。 例: 北京大飯店 酒索引得分 0; 店 得分 1; 大得分1.1 最後的結果是 北京大飯店相關度得分1.1ci
QueryBuilders.disMaxQuery() .add(QueryBuilders.termQuery("hotelName","酒")) .add(QueryBuilders.termQuery("hotelName","店")) .add(QueryBuilders.termQuery("hotelName","大"));
四、boosting query文檔
一種複合查詢,分爲positive子查詢和negitive子查詢,二者的查詢結構都會返回。 positive子查詢的score保持不變,negetive子查詢的值將會根據negative_boost(小於1)的值相乘,作相應程度的下降分值 hotelName 檢索酒店,hotelNo 檢索123 hotelNo檢索得到的分值經過乘以0.3來下降分值,下降相關度get
QueryBuilders.boostingQuery().positive(QueryBuilders.matchQuery("hotelName", "酒店")).negative(QueryBuilders.matchQuery("hotelNo","123")).negativeBoost(0.3f)
五、 indices Queryit
跨索引複合查詢,實現跨索引的查詢,並提供沒有查詢到結果是 從其餘索引查詢(默認是從其餘全部索引進行匹配) 以下實例:從 索引1,索引2 中查詢hotelName = "7天"的 term 查詢。 若是沒有查詢到數據,從 索引3 查詢hotelName = "置" 的term查詢,若是沒有指明索引3,默認從client下全部索引中進行匹配結果io
QueryBuilder queryBuilder = QueryBuilders.indicesQuery(QueryBuilders.termQuery("hotelName", "7天"), "索引1","索引2") .noMatchQuery(QueryBuilders.termQuery("hotelName", "置")); System.out.println(queryBuilder); SearchResponse response = client.prepareSearch("索引3") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .execute() .actionGet();
六、 and Query
與 請求查詢,要求必須知足全部term查詢 以下實例:hotelName 必須同時知足 7 和 天 兩個term查詢 不過如今該方法再client已經標記爲過期,推薦使用boolQuery 的must來實現
QueryBuilder queryBuilder = QueryBuilders.andQuery(QueryBuilders.termQuery("hotelName", "7")).add(QueryBuilders.termQuery("hotelName", "天")); 至關於 QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("hotelName", "7")).must(QueryBuilders.termQuery("hotelName", "天"));
七、 or query
或 請求查詢,要求知足其中一個term查詢便可,如今也屬於過期的方法,推薦使用boolQuery來代替。 略過,
八、 filtered Query
過濾查詢: 根據第一個term來查詢結果,經過第二個term進行過濾 已經標記爲過期方法:推薦使用:boolQuery的 must來實現 以下實例:查詢hotelName 爲 "7"的文檔,並過濾hotelName爲天的做爲結果文檔
QueryBuilder queryBuilder = QueryBuilders.filteredQuery(QueryBuilders.termQuery("hotelName", "7"),QueryBuilders.termQuery("hotelName","天"));
九、limit Query
沒實現出來,經過看源代碼提示結合文檔,得出以下結論 限制每一個分片的檢索數量,已經標記爲過期 ,經過SearchRequestBuilder#setTerminateAfter(int) 代替實現 以下實例:沒個分片查詢1個數據,
QueryBuilder queryBuilder = QueryBuilders.termQuery("hotelName","酒"); System.out.println(queryBuilder); SearchResponse response = client.prepareSearch("titan_hotel") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(queryBuilder).setTerminateAfter(1) .execute() .actionGet();