ElasticSearch查询模板
生活随笔
收集整理的這篇文章主要介紹了
ElasticSearch查询模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
需要的jar包,我這里使用maven的pom.xml導入,可以自己下載jar包并導入到項目中
????????????????<dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.4.2</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>5.4.2</version></dependency>連接集群ClientConnect.java
import java.net.InetSocketAddress;import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient;/*** * @createDate 2018年3月8日* @class_name ClientConnect 連接ES集群* @description : 建立es的client,通過getClient()調用,只能連接es5.4.2*/ public class ClientConnect {private TransportClient client;public TransportClient getClient() {return client;}/*** * @param clusterName???? 集群名稱* @param clusterAddress????集群ip地址* @param port???????????? 端口號*/@SuppressWarnings({ "unchecked", "resource" })public ClientConnect(String clusterName, String clusterAddress, int port) {Settings settings = Settings.builder().put("cluster.name", clusterName).build();client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress(clusterAddress, port)));System.out.println("success connect");}}查詢模板BaseSearch.java
package util;import java.util.Arrays; import java.util.Iterator;import org.apache.lucene.search.Sort; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.lucene.search.function.CombineFunction; import org.elasticsearch.common.lucene.search.function.FieldValueFactorFunction.Modifier; import org.elasticsearch.index.query.MultiMatchQueryBuilder.Type; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.sort.SortOrder; import org.junit.Test;/*** @date 2018年3月8日* @class_name baseSearch* @description : 查詢模板*/ public class BaseSearch {private TransportClient client;private SearchResponse response;private SearchRequestBuilder searchRequestBuilder;/*** @description : 構造一個搜索實例* @param client es服務器的ip地址*/public BaseSearch(TransportClient client){this.client=client;}/*** @description : 使用前必須先自定義搜索語句*/private QueryBuilder setQuery(){/* * must 查詢子句must出現在文檔中,并且會影響文檔得分score* filter 查詢子句must出現在文檔中,但是不會影響文檔得分,并且會緩存* should 查詢子句should出現在文檔中,即并列的should子句必須有一個或者多個出現在文檔中,可以通過設置參數 minimum_should_match來指定最少匹配的查詢子句* must_not 查詢子句一定不能出現在文檔中,處于filter上下文,不影響文檔得分,會被緩存* * 1. 加權查詢,數據在"title","summary","author","content"四個字段中包含搜索關鍵詞"國經理",并將該次查詢分數變成1.0倍。* 2. 整句查詢,數據在"title","summary"字段中包含搜索關鍵短語"事件反腐風暴",事件反腐風暴不分詞,事件反腐風暴中間可間隔2位* 3. 模糊查詢,數據在"title","summary"字段中包含搜索關鍵詞"國經理",并將該次查詢設置為模糊查詢,模糊程度"AUTO"* 4. 數據在"title"字段中包含搜索符合關鍵詞"反腐","國家","公司"中任意一個條件,并并將該次查詢分數變成-0.9倍* 5. 數據不在"title","summary","author","content"任意一個字段內含有關鍵詞"交易"* 6. 通配符查詢,數據在"author"字段中含有通配符表達式"*w*",支持? 匹配任何字符,*匹配零個或多個字符* 7. 正則查詢,數據在"author"字段中含有正則表達式"[a-z]k[a-z]"* 8. 前綴短語查詢,數據在"summary"字段中以"據"開頭的數據* 9-11。數據在3個should中滿足至少一個查詢子句* 12. 設置至少要符合多少個條件,參數為百分比,或者整型* 13. 數據在"publish_time"字段里的數據在from("2018-01-13 14:21:09")和to("2018-01-17 14:21:09")之間* 14. 數據存在"title"字段* 15. 衰減函數DecayFunction(field, origin, scale, offset, decay),有linear,gauss,exponential三種,數據離origin越近得分越高* 16. 域值因子fieldValueFactorFunction(field).通過字段field里的值提高數據的得分*/return QueryBuilders.boolQuery()/*1*/ // .must(QueryBuilders.multiMatchQuery("國經理", "title","summary","author","content").boost(1.0f))/*2*/ // .must(QueryBuilders.multiMatchQuery("事件反腐風暴", "title","summary").type(Type.PHRASE).slop(2))/*3*/ // .must(QueryBuilders.multiMatchQuery("報道", "title","summary").fuzziness("AUTO"))/*4*/ // .must(QueryBuilders.termsQuery("title", "反腐","國家","公司").boost(-0.9f))/*5*/ // .mustNot(QueryBuilders.multiMatchQuery("交易", "title","summary","author","content"))/*6*/ // .must(QueryBuilders.wildcardQuery("author", "*w*"))/*7*/ // .must(QueryBuilders.regexpQuery("author", "[a-z]k[a-z]"))/*8*/ // .must(QueryBuilders.matchPhrasePrefixQuery("summary","據"))/*9*/ // .should(QueryBuilders.multiMatchQuery("億元","title","summary","author","content"))/*10*/ // .should(QueryBuilders.multiMatchQuery("嚴格","title","summary","author","content"))/*11*/ // .should(QueryBuilders.multiMatchQuery("發表","title","summary","author","content"))/*12*/ // .minimumShouldMatch("55%")/*13*/ // .must(QueryBuilders.rangeQuery("publish_time").from("2018-01-13 14:21:09").to("2018-01-17 14:21:09"))//50.45 59.12 1741 1749.66/*14*/ // .must(QueryBuilders.existsQuery("title"))/*15*/ // .must(QueryBuilders.functionScoreQuery(ScoreFunctionBuilders.linearDecayFunction("price",67,20,5,0.5)))/*16*/ // .must(QueryBuilders.functionScoreQuery(ScoreFunctionBuilders.fieldValueFactorFunction("comment").modifier(Modifier.LN1P).factor(0.1f)).boostMode(CombineFunction.SUM));}/*** @description : 使用前必須先自定義過濾語句,過濾不影響得分,*/private QueryBuilder setFilter(){/* * must 查詢子句must出現在文檔中,并且會影響文檔得分score* filter 查詢子句must出現在文檔中,但是不會影響文檔得分,并且會緩存* should 查詢子句should出現在文檔中,即并列的should子句必須有一個或者多個出現在文檔中,可以通過設置參數 minimum_should_match來指定最少匹配的查詢子句* must_not 查詢子句一定不能出現在文檔中,處于filter上下文,不影響文檔得分,會被緩存* * 1. 加權查詢,數據在"title","summary","author","content"四個字段中包含搜索關鍵詞"國經理",并將該次查詢分數變成1.5倍。* 2. 整句查詢,數據在"title","summary"字段中包含搜索關鍵短語"事件反腐風暴",事件反腐風暴不分詞,事件反腐風暴中間可間隔2位* 3. 模糊查詢,數據在"title","summary"字段中包含搜索關鍵詞"國經理",并將該次查詢設置為模糊查詢,模糊程度"AUTO"* 4. 數據在"title"字段中包含搜索符合關鍵詞"反腐","國家","公司"中任意一個條件,并并將該次查詢分數變成-0.9倍* 5. 數據不在"title","summary","author","content"任意一個字段內含有關鍵詞"交易"* 6. 通配符查詢,數據在"author"字段中含有通配符表達式"*w*",支持? 匹配任何字符,*匹配零個或多個字符* 7. 正則查詢,數據在"author"字段中含有正則表達式"[a-z]k[a-z]"* 8. 前綴短語查詢,數據在"summary"字段中以"據"開頭的數據* 9-11。 數據在3個should中滿足至少一個查詢子句* 12. 設置至少要符合多少個條件,參數為百分比,或者整型* 13. 數據在"publish_time"字段里的數據在from("2018-01-13 14:21:09")和to("2018-01-17 14:21:09")之間*/return QueryBuilders.boolQuery()/*1*/ // .must(QueryBuilders.multiMatchQuery("國經理", "title","summary","author","content").boost(1.5f))/*2*/ // .must(QueryBuilders.multiMatchQuery("事件反腐風暴", "title","summary").type(Type.PHRASE).slop(2))/*3*/ // .must(QueryBuilders.multiMatchQuery("報道", "title","summary").fuzziness("AUTO"))/*4*/ // .must(QueryBuilders.termsQuery("title", "反腐","國家","公司").boost(-0.9f))/*5*/ // .mustNot(QueryBuilders.multiMatchQuery("交易", "title","summary","author","content"))/*6*/ // .must(QueryBuilders.wildcardQuery("author", "*w*"))/*7*/ // .must(QueryBuilders.regexpQuery("author", "[a-z]k[a-z]"))/*8*/ // .must(QueryBuilders.matchPhrasePrefixQuery("summary","據"))/*9*/ // .should(QueryBuilders.multiMatchQuery("億元","title","summary","author","content"))/*10*/ // .should(QueryBuilders.multiMatchQuery("嚴格","title","summary","author","content"))/*11*/ // .should(QueryBuilders.multiMatchQuery("發表","title","summary","author","content"))/*12*/ // .minimumShouldMatch("55%")/*13*/ // .must(QueryBuilders.rangeQuery("publish_time").from("2018-01-13 14:21:09").to("2018-01-17 14:21:09"));}/*** @description : 使用前必須先自定義高亮設置語句*/private HighlightBuilder setHighlight(){HighlightBuilder highlightBuild = new HighlightBuilder()// 設置被高亮的字段.field("summary").field("title")// 設置高亮的標簽.preTags("<strong>").postTags("</strong>");return highlightBuild;}/*** @param response * @description : 打印搜索結果*/public void printResponse(){response=this.getResponse();// timed_outboolean isTimedOut = response.isTimedOut();System.out.println("查詢成功,timed_out:"+isTimedOut);// _shards,查詢總分片數,查詢成功片數,查詢失敗片數int totalShards = response.getTotalShards();int successfulShards = response.getSuccessfulShards();int failedShards = response.getFailedShards();System.out.println("查詢分片數:{ total="+totalShards+" successful="+successfulShards+" failed="+failedShards+"},查詢到"+response.getHits().totalHits+"條記錄");// 文檔在hit數組中,更多方法使用請看API中SearchHitsSearchHits searchHits = response.getHits();Iterator<SearchHit> iterator = searchHits.iterator();while(iterator.hasNext()) {SearchHit hit = iterator.next();String hitIndex = hit.getIndex();String hitType = hit.getType();String id = hit.getId();float score = hit.getScore();System.out.println("index="+hitIndex+" type="+hitType+" id="+id+" score="+score+" source-->"+hit.getSourceAsString());System.out.println(hit.getHighlightFields());}System.out.println("查詢結束...");}/*** @description 獲取搜索結果,需先修改BasaSearch里的方法setQuery(),setFilter(),setHighlight()* @param indexs 索引名稱* @param types 類型名稱*/public void getSearchByIndexAndType(String[] indexs,String[] types) {System.out.print("集群中查詢索引為"+Arrays.deepToString(indexs)+"和類型為"+Arrays.deepToString(types)+"的所有數據");//查詢QueryBuilder queryBulid=this.setQuery();QueryBuilder filterBulid=this.setFilter();HighlightBuilder highlightBuild1=this.setHighlight();searchRequestBuilder = //設置查詢的index,例{"twitter","indexName"} client.prepareSearch(indexs)//設置查詢的type,例{"tweet","typeName"}.setTypes(types)/* 設置查詢類型* 1.SearchType.DFS_QUERY_THEN_FETCH = 最精確* 2.SearchType.QUERY_THEN_FETCH = 比較快*/.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)//設置查詢.setQuery(queryBulid)//設置過濾器.setPostFilter(filterBulid) //設置獲取查詢數據的位置 .setFrom(0)//設置獲取查詢數據的數量.setSize(50)//設置是否按查詢匹配度排序,很耗資源,只能用作調試工具,千萬不要用于生產環境 // .setExplain(true)//設置顯示高亮,.highlighter(highlightBuild1)//設置根據"publish_time"排序 // .addSort("publish_time", SortOrder.DESC);System.out.println("開始查詢...");//建立查詢,并返回結果SearchResponse response = searchRequestBuilder.get();this.setResponse(response);}/*** @description : 獲取發送給服務器的請求的JSON格式* @return String*/public String getRequestJSON(){return searchRequestBuilder.toString();}public TransportClient getClient() {return client;}public void setClient(TransportClient client) {this.client = client;}public SearchRequestBuilder getSearchRequestBuilder() {return searchRequestBuilder;}public void setSearchRequestBuilder(SearchRequestBuilder searchRequestBuilder) {this.searchRequestBuilder = searchRequestBuilder;}public SearchResponse getResponse() {return response;}public void setResponse(SearchResponse response) {this.response = response;} }測試實例SearchTest.java
package instancetest;import org.elasticsearch.client.transport.TransportClient;import util.BaseSearch; import util.ClientConnect;public class SearchTest {public static void main(String[] args) {// TODO Auto-generated method stubTransportClient client = new ClientConnect("elasticsearch", "192.168.203.201", 9320).getClient();BaseSearch bs = new BaseSearch(client);String[] index = {};String[] type = {};// 從index和type中搜索,為空則為全部搜索bs.getSearchByIndexAndType(index, type);// 打印服務器的回復bs.printResponse();// 打印發送的請求System.out.println(bs.getRequestJSON());}}根據需求修改查詢模板BaseSearch.java來獲取想要的檢索結果。
通過進行各種嘗試來掌握ElasticSearch的查詢功能。
注意:使用的ElasticSearch的jar包要和集群使用的版本一樣,不然可能出現連接不上集群的錯誤。
總結
以上是生活随笔為你收集整理的ElasticSearch查询模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang Windows下编译lin
- 下一篇: Jeecg框架 修改首页