成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Elasticsearch Java High Level REST Client(Search A

liuhh / 3513人閱讀

摘要:搜索請求用于與搜索文檔聚合相關(guān)的任何操作,還提供了在結(jié)果文檔上請求高亮的方法。將字段高光色添加到高亮構(gòu)建器。稍后可以從中檢索高亮的文本片段。

Search API 搜索請求

SearchRequest用于與搜索文檔、聚合、suggestions相關(guān)的任何操作,還提供了在結(jié)果文檔上請求高亮的方法。

在最基本的表單中,我們可以向請求添加查詢:

SearchRequest searchRequest = new SearchRequest(); 
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
searchSourceBuilder.query(QueryBuilders.matchAllQuery()); 
searchRequest.source(searchSourceBuilder); 

創(chuàng)建SeachRequest,沒有參數(shù),這將針對所有索引運(yùn)行。

大多數(shù)搜索參數(shù)都添加到SearchSourceBuilder中,它為搜索請求body中的所有內(nèi)容提供了setter。

match_all查詢添加到SearchSourceBuilder。

SearchSourceBuilder添加到SeachRequest

可選參數(shù)

我們先來看一下SearchRequest的一些可選參數(shù):

SearchRequest searchRequest = new SearchRequest("posts");
searchRequest.types("doc");

將請求限制為一個索引。

將請求限制為一個類型。

還有一些其他有趣的可選參數(shù):

searchRequest.routing("routing");

設(shè)置路由參數(shù)。

searchRequest.indicesOptions(IndicesOptions.lenientExpandOpen());

設(shè)置IndicesOptions控制如何解析不可用的索引以及如何擴(kuò)展通配符表達(dá)式。

searchRequest.preference("_local");

使用首選項參數(shù),例如執(zhí)行搜索以優(yōu)先選擇本地碎片,默認(rèn)是隨機(jī)的跨碎片。

使用SearchSourceBuilder

控制搜索行為的大多數(shù)選項都可以在SearchSourceBuilder上設(shè)置,它包含或多或少與Rest API的搜索請求body中等效的選項。

以下是一些常見選項的幾個示例:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); 
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy")); 
sourceBuilder.from(0); 
sourceBuilder.size(5); 
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

使用默認(rèn)選項創(chuàng)建SearchSourceBuilder

設(shè)置查詢,可以是任何類型的QueryBuilder

設(shè)置確定結(jié)果要從哪個索引開始搜索的from選項,默認(rèn)為0。

設(shè)置確定搜索命中返回的數(shù)的size選項,默認(rèn)為10。

設(shè)置一個可選的超時,控制允許搜索的時間。

在此之后,只需將SearchSourceBuilder添加到SearchRequest

SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("posts");
searchRequest.source(sourceBuilder);
構(gòu)建查詢

使用QueryBuilder對象創(chuàng)建搜索查詢,QueryBuilder存在對于Elasticsearch的查詢DSL支持的每種搜索查詢類型。

可以使用其構(gòu)造函數(shù)創(chuàng)建QueryBuilder

MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("user", "kimchy");

創(chuàng)建一個在字段“user”上匹配文本“kimchy”的全文匹配查詢。

創(chuàng)建后,QueryBuilder對象提供了配置其創(chuàng)建的搜索查詢選項的方法:

matchQueryBuilder.fuzziness(Fuzziness.AUTO); 
matchQueryBuilder.prefixLength(3); 
matchQueryBuilder.maxExpansions(10); 

在匹配查詢上啟用模糊匹配。

在匹配查詢上設(shè)置前綴長度選項。

設(shè)置最大擴(kuò)展選項以控制查詢的模糊過程。

也可以使用QueryBuilders實用程序類創(chuàng)建QueryBuilder對象,此類提供了可用于使用流暢的編程樣式創(chuàng)建QueryBuilder對象的輔助方法:

QueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("user", "kimchy")
                                                .fuzziness(Fuzziness.AUTO)
                                                .prefixLength(3)
                                                .maxExpansions(10);

無論用于創(chuàng)建它的方法是什么,都必須將QueryBuilder對象添加到SearchSourceBuilder,如下所示:

searchSourceBuilder.query(matchQueryBuilder);

構(gòu)建查詢頁面提供了所有可用的搜索查詢的列表及其相應(yīng)的QueryBuilder對象和QueryBuilders輔助方法。

指定排序

SearchSourceBuilder允許添加一個或多個SortBuilder實例,有四種特殊的實現(xiàn)(Field-,Score-,GeoDistance-和ScriptSortBuilder)。

sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC)); 
sourceBuilder.sort(new FieldSortBuilder("_uid").order(SortOrder.ASC));

_score降序排序(默認(rèn)值)。

也可以按_id字段進(jìn)行升序排序。

源過濾

默認(rèn)情況下,搜索請求會返回文檔_source的內(nèi)容,但與Rest API中的內(nèi)容一樣,你可以覆蓋此行為,例如,你可以完全關(guān)閉_source檢索:

sourceBuilder.fetchSource(false);

該方法還接受一個或多個通配符模式的數(shù)組,以控制以更精細(xì)的方式包含或排除哪些字段:

String[] includeFields = new String[] {"title", "user", "innerObject.*"};
String[] excludeFields = new String[] {"_type"};
sourceBuilder.fetchSource(includeFields, excludeFields);
請求高亮

通過在SearchSourceBuilder上設(shè)置HighlightBuilder,可以實現(xiàn)高亮搜索結(jié)果,通過將一個或多個HighlightBuilder.Field實例添加到HighlightBuilder,可以為每個字段定義不同的高亮行為。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
HighlightBuilder highlightBuilder = new HighlightBuilder(); 
HighlightBuilder.Field highlightTitle =
        new HighlightBuilder.Field("title"); 
highlightTitle.highlighterType("unified");  
highlightBuilder.field(highlightTitle);  
HighlightBuilder.Field highlightUser = new HighlightBuilder.Field("user");
highlightBuilder.field(highlightUser);
searchSourceBuilder.highlighter(highlightBuilder);

創(chuàng)建一個新的HighlightBuilder。

title字段創(chuàng)建字段高光色。

設(shè)置字段高光色類型。

將字段高光色添加到高亮構(gòu)建器。

Rest API文檔中有許多選項需要詳細(xì)說明,Rest API參數(shù)(例如pre_tags)通常由具有相似名稱的setter更改而來(例如#preTags(String ...))。

稍后可以從SearchResponse中檢索高亮的文本片段。

請求聚合

可以通過先創(chuàng)建適當(dāng)?shù)?b>AggregationBuilder然后在SearchSourceBuilder上設(shè)置聚合來將聚合添加到搜索中,在以下示例中,我們在公司名稱上創(chuàng)建terms聚合 ,使用子聚合在公司員工平均年齡上:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder aggregation = AggregationBuilders.terms("by_company")
        .field("company.keyword");
aggregation.subAggregation(AggregationBuilders.avg("average_age")
        .field("age"));
searchSourceBuilder.aggregation(aggregation);

構(gòu)建聚合頁面提供了所有可用的聚合的列表及其對應(yīng)的AggregationBuilder對象和AggregationBuilders輔助方法。

稍后我們將看到如何訪問SearchResponse中的聚合。

請求Suggestion

要向搜索請求添加建議,請使用從SuggestBuilders工廠類中可輕松訪問的SuggestionBuilder的實現(xiàn)之一,Suggestion構(gòu)建器需要添加到頂級SuggestBuilder,它本身可以在SearchSourceBuilder上設(shè)置。

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
SuggestionBuilder termSuggestionBuilder =
    SuggestBuilders.termSuggestion("user").text("kmichy"); 
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("suggest_user", termSuggestionBuilder); 
searchSourceBuilder.suggest(suggestBuilder);

user字段和文本kmichy創(chuàng)建一個新的TermSuggestionBuilder。

添加suggestion構(gòu)建器并將其命名為suggest_user

我們稍后將看到如何從SearchResponse中檢索suggestion。

分析查詢和聚合

分析API可用于分析特定搜索請求的查詢和聚合的執(zhí)行情況,為了使用它,必須在SearchSourceBuilder上將profile標(biāo)志設(shè)置為true

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.profile(true);

執(zhí)行SearchRequest后,相應(yīng)的SearchResponse將包含分析結(jié)果。

同步執(zhí)行

以下列方式執(zhí)行SearchRequest時,客戶端在繼續(xù)執(zhí)行代碼之前等待返回SearchResponse

SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
異步執(zhí)行

執(zhí)行SearchRequest也可以以異步方式完成,以便客戶端可以直接返回,用戶需要通過將請求和監(jiān)聽器傳遞給異步搜索方法來指定響應(yīng)或潛在的故障如何處理:

client.searchAsync(searchRequest, RequestOptions.DEFAULT, listener);

要執(zhí)行的SearchRequest和執(zhí)行完成時要使用的ActionListener

異步方法不會阻塞并且立即返回,完成后,如果執(zhí)行成功完成則使用onResponse方法回調(diào)ActionListener,如果失敗則使用onFailure方法。

SearchResponse的典型監(jiān)聽器如下所示:

ActionListener listener = new ActionListener() {
    @Override
    public void onResponse(SearchResponse searchResponse) {
        
    }

    @Override
    public void onFailure(Exception e) {
        
    }
};

onResponse:執(zhí)行成功完成時調(diào)用。

onFailure:在整個SearchRequest失敗時調(diào)用。

SearchResponse

通過執(zhí)行搜索返回的SearchResponse提供有關(guān)搜索執(zhí)行本身以及對返回文檔的訪問的詳細(xì)信息,首先,有關(guān)于請求執(zhí)行本身的有用信息,例如HTTP狀態(tài)碼,執(zhí)行時間或請求是提前終止還是超時:

RestStatus status = searchResponse.status();
TimeValue took = searchResponse.getTook();
Boolean terminatedEarly = searchResponse.isTerminatedEarly();
boolean timedOut = searchResponse.isTimedOut();

其次,響應(yīng)還通過提供有關(guān)搜索影響的碎片總數(shù)以及成功與不成功碎片的統(tǒng)計信息的碎片級別執(zhí)行的信息,可以通過在ShardSearchFailures上迭代數(shù)組來處理可能的失敗,如下例所示:

int totalShards = searchResponse.getTotalShards();
int successfulShards = searchResponse.getSuccessfulShards();
int failedShards = searchResponse.getFailedShards();
for (ShardSearchFailure failure : searchResponse.getShardFailures()) {
    // failures should be handled here
}
檢索SearchHits

要訪問返回的文檔,我們需要先獲取響應(yīng)中包含的SearchHits

SearchHits hits = searchResponse.getHits();

SearchHits提供有關(guān)所有匹配的全局信息,例如總命中數(shù)或最高分?jǐn)?shù):

long totalHits = hits.getTotalHits();
float maxScore = hits.getMaxScore();

嵌套在SearchHits中的是可以迭代的單個搜索結(jié)果:

SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
    // do something with the SearchHit
}

SearchHit提供對每個搜索命中的索引、類型、docId和分?jǐn)?shù)等基本信息的訪問:

String index = hit.getIndex();
String type = hit.getType();
String id = hit.getId();
float score = hit.getScore();

此外,它還允許你以簡單的JSON-String或鍵/值對映射的形式返回文檔源,在此映射中,常規(guī)字段由字段名稱鍵控并包含字段值,多值字段作為對象列表返回,嵌套對象作為另一個鍵/值映射返回,這些案例需要相應(yīng)地進(jìn)行投射:

String sourceAsString = hit.getSourceAsString();
Map sourceAsMap = hit.getSourceAsMap();
String documentTitle = (String) sourceAsMap.get("title");
List users = (List) sourceAsMap.get("user");
Map innerObject =
        (Map) sourceAsMap.get("innerObject");
檢索高亮

如果需要,可以從結(jié)果中的每個SearchHit檢索高亮的文本片段,命中對象提供對HighlightField實例的字段名稱映射的訪問,每個實例包含一個或多個高亮的文本片段:

SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits.getHits()) {
    Map highlightFields = hit.getHighlightFields();
    HighlightField highlight = highlightFields.get("title"); 
    Text[] fragments = highlight.fragments();  
    String fragmentString = fragments[0].string();
}

獲取title字段的高亮。

獲取包含高亮的字段內(nèi)容的一個或多個片段。

檢索聚合

可以從SearchResponse檢索聚合,先獲取聚合樹的根,Aggregations對象,然后按名稱獲取聚合。

Aggregations aggregations = searchResponse.getAggregations();
Terms byCompanyAggregation = aggregations.get("by_company"); 
Bucket elasticBucket = byCompanyAggregation.getBucketByKey("Elastic"); 
Avg averageAge = elasticBucket.getAggregations().get("average_age"); 
double avg = averageAge.getValue();

獲取by_companyterms聚合。

獲取使用Elastic鍵入的桶。

從該桶中獲取average_age子聚合。

請注意,如果按名稱訪問聚合,則需要根據(jù)所請求的聚合類型指定聚合接口,否則將引發(fā)ClassCastException

Range range = aggregations.get("by_company");

這將引發(fā)異常,因為“by_company”是一個terms聚合,但我們嘗試將其作為range聚合進(jìn)行檢索。

還可以將所有聚合作為由聚合名稱鍵入的映射進(jìn)行訪問,在這種情況下,需要顯式地進(jìn)行到正確聚合接口的轉(zhuǎn)換:

Map aggregationMap = aggregations.getAsMap();
Terms companyAggregation = (Terms) aggregationMap.get("by_company");

還有一些getter將所有頂級聚合作為列表返回:

List aggregationList = aggregations.asList();

最后但并非最不重要的是,你可以迭代所有聚合,然后例如決定如何根據(jù)類型進(jìn)一步處理它們:

for (Aggregation agg : aggregations) {
    String type = agg.getType();
    if (type.equals(TermsAggregationBuilder.NAME)) {
        Bucket elasticBucket = ((Terms) agg).getBucketByKey("Elastic");
        long numberOfDocs = elasticBucket.getDocCount();
    }
}
檢索suggestions

要從SearchResponse獲取suggestions,請使用Suggest對象作為入口點(diǎn),然后檢索嵌套的suggestion對象:

Suggest suggest = searchResponse.getSuggest(); 
TermSuggestion termSuggestion = suggest.getSuggestion("suggest_user"); 
for (TermSuggestion.Entry entry : termSuggestion.getEntries()) { 
    for (TermSuggestion.Entry.Option option : entry) { 
        String suggestText = option.getText().string();
    }
}

使用Suggest類訪問suggestions。

可以通過名稱檢索suggestions,你需要將它們分配給正確類型的Suggestion類(此處為TermSuggestion),否則拋出ClassCastException。

迭代suggestion條目。

在一個條目中迭代選項。

檢索性能分析結(jié)果

使用getProfileResults()方法從SearchResponse檢索分析結(jié)果,此方法返回包含SearchSquest執(zhí)行中涉及的每個碎片的ProfileShardResult對象的Map,ProfileShardResult使用唯一標(biāo)識分析結(jié)果對應(yīng)的碎片的鍵存儲在Map中。

下面是一個示例代碼,顯示如何迭代每個碎片的所有分析結(jié)果:

Map profilingResults =
        searchResponse.getProfileResults(); 
for (Map.Entry profilingResult : profilingResults.entrySet()) { 
    String key = profilingResult.getKey(); 
    ProfileShardResult profileShardResult = profilingResult.getValue(); 
}

SearchResponse中檢索ProfileShardResultMap

如果鍵已知,則可以通過碎片的鍵檢索分析結(jié)果,否則迭代所有分析結(jié)果可能更簡單。

檢索標(biāo)識ProfileShardResult屬于哪個碎片的鍵。

檢索給定碎片的ProfileShardResult。

ProfileShardResult對象本身包含一個或多個查詢分析結(jié)果,每個查詢針對基礎(chǔ)Lucene索引執(zhí)行:

List queryProfileShardResults =
        profileShardResult.getQueryProfileResults(); 
for (QueryProfileShardResult queryProfileResult : queryProfileShardResults) { 

}

檢索QueryProfileShardResult的列表。

迭代每個QueryProfileShardResult。

每個QueryProfileShardResult都提供對詳細(xì)查詢樹執(zhí)行的訪問,作為ProfileResult對象列表返回:

for (ProfileResult profileResult : queryProfileResult.getQueryResults()) { 
    String queryName = profileResult.getQueryName(); 
    long queryTimeInMillis = profileResult.getTime(); 
    List profiledChildren = profileResult.getProfiledChildren(); 
}

迭代分析結(jié)果。

檢索Lucene查詢的名稱。

檢索執(zhí)行Lucene查詢所花費(fèi)的時間。

檢索子查詢的分析結(jié)果(如果有)。

Rest API文檔包含有關(guān)分析查詢的更多信息以及查詢分析信息的說明。

QueryProfileShardResult還可以訪問Lucene收集器的分析信息:

CollectorResult collectorResult = queryProfileResult.getCollectorResult();  
String collectorName = collectorResult.getName();  
Long collectorTimeInMillis = collectorResult.getTime(); 
List profiledChildren = collectorResult.getProfiledChildren(); 

檢索Lucene收集器的分析結(jié)果。

檢索Lucene收集器的名稱。

檢索執(zhí)行Lucene收集器所花費(fèi)的時間。

檢索子收集器的分析結(jié)果(如果有)。

Rest API文檔包含有關(guān)Lucene收集器的分析信息的更多信息。

以與查詢樹執(zhí)行非常類似的方式,QueryProfileShardResult對象提供對詳細(xì)聚合樹執(zhí)行的訪問:

AggregationProfileShardResult aggsProfileResults =
        profileShardResult.getAggregationProfileResults(); 
for (ProfileResult profileResult : aggsProfileResults.getProfileResults()) { 
    String aggName = profileResult.getQueryName(); 
    long aggTimeInMillis = profileResult.getTime(); 
    List profiledChildren = profileResult.getProfiledChildren(); 
}

檢索AggregationProfileShardResult。

迭代聚合分析結(jié)果。

檢索聚合的類型(對應(yīng)于用于執(zhí)行聚合的Java類)。

檢索執(zhí)行Lucene收集器所花費(fèi)的時間。

檢索子聚合的分析結(jié)果(如果有)。

Rest API文檔包含有關(guān)分析聚合的更多信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71918.html

相關(guān)文章

  • Elasticsearch Java REST Client(目錄)

    摘要:用于的官方高級別客戶端,基于低級別客戶端,它公開特定的方法,并負(fù)責(zé)請求編組和響應(yīng)反編組。入門初始化執(zhí)行請求讀取響應(yīng)日志記錄通用配置嗅探器在中被添加。依賴于核心項目,它接受與相同的請求參數(shù),并返回相同的響應(yīng)對象。 Elasticsearch Java REST Client Java REST Client有兩種類型: Java Low Level REST Client:用于Elast...

    roland_reed 評論0 收藏0
  • Elasticsearch實戰(zhàn)Java High Level REST Client實現(xiàn)員工管理案例

    摘要:開發(fā)環(huán)境這里講的是實戰(zhàn)對于如何安裝,配置環(huán)境變量,配置不做講解詳細(xì)請查看學(xué)習(xí)筆記四在上安裝和啟動增量同步數(shù)據(jù)到方式實現(xiàn)從零到一超級詳里面有做詳細(xì)講解,對于搭建集群目前還沒有寫相關(guān)文章,讀者可以自行在項目的文件中添加的依賴實現(xiàn)員工信息 開發(fā)環(huán)境: elasticsearch:7.0.0kibana:7.0.0JDK: 1.8.0_201maven: 3.6.1 這里講的是實戰(zhàn)對于如何安裝...

    Barry_Ng 評論0 收藏0
  • Elasticsearch Java High Level REST Client(入門)

    摘要:入門本節(jié)描述從獲取工件到在應(yīng)用程序中使用它如何開始使用高級別客戶端。保證能夠與運(yùn)行在相同主版本和大于或等于的次要版本上的任何節(jié)點(diǎn)通信。與具有相同的發(fā)布周期,將版本替換為想要的客戶端版本。 Java High Level REST Client 入門 本節(jié)描述從獲取工件到在應(yīng)用程序中使用它如何開始使用高級別REST客戶端。 兼容性 Java High Level REST Client需...

    honmaple 評論0 收藏0

發(fā)表評論

0條評論

liuhh

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<