Elasticsearch Compound Query 複合查詢詳解

一、 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();
相關文章
相關標籤/搜索