Elasticsearch 5.4.3实战--Java API调用:搜索建议
Posted 跳刀不跳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch 5.4.3实战--Java API调用:搜索建议相关的知识,希望对你有一定的参考价值。
通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示。 那么这个功能在elasticsearch中如何实现呢?
Elasticsearch里设计了4种类别的Suggester,分别是:
- Term Suggester
- Phrase Suggester
- Completion Suggester
- Context Suggester
我是采用Completion Suggester来实现的。
原理的文章网上有很多,这里不多说。我们直接上代码:
1 package com.cs99lzzs.elasticsearch.service.imp; 2 3 import java.text.DecimalFormat; 4 import java.util.ArrayList; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.annotation.Resource; 10 11 import org.apache.commons.lang.StringUtils; 12 import org.apache.log4j.Logger; 13 import org.apache.lucene.queryparser.classic.QueryParser; 14 import org.elasticsearch.action.search.SearchRequestBuilder; 15 import org.elasticsearch.action.search.SearchResponse; 16 import org.elasticsearch.action.search.SearchType; 17 import org.elasticsearch.client.Client; 18 import org.elasticsearch.index.query.BoolQueryBuilder; 19 import org.elasticsearch.index.query.QueryBuilder; 20 import org.elasticsearch.index.query.QueryBuilders; 21 import org.elasticsearch.search.SearchHit; 22 import org.elasticsearch.search.aggregations.Aggregation; 23 import org.elasticsearch.search.aggregations.AggregationBuilders; 24 import org.elasticsearch.search.aggregations.bucket.terms.StringTerms; 25 import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket; 26 import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; 27 import org.elasticsearch.search.sort.SortBuilder; 28 import org.elasticsearch.search.sort.SortBuilders; 29 import org.elasticsearch.search.sort.SortOrder; 30 import org.elasticsearch.search.suggest.Suggest; 31 import org.elasticsearch.search.suggest.SuggestBuilder; 32 import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder; 33 import org.springframework.beans.factory.annotation.Value; 34 import org.springframework.stereotype.Service; 35 36 37 @Service("productSearchService") 38 public class ProductSearchServiceImp implements ProductSearchService { 39 40 private static Logger logger = Logger.getLogger(ProductSearchService.class); 41 42 private static String aggrationBrandName = "brand_count"; 43 44 private static String suggestZhName = "suggestName"; 45 46 @Resource(name="esClient") 47 Client esClient; 48 49 @Value("${elasticsearch.index}") 50 private String CLUSTER_INDEX; 51 52 @Value("${elasticsearch.type}") 53 private String CLUSTER_TYPE; 54 55 56 /** 57 * @return 58 */ 59 @Override 60 public List<String> getSuggestList(String keyword, int number) { 61 List<String> suggestList = new ArrayList<String>(); 62 63 CompletionSuggestionBuilder suggestZhNameBuilder = new CompletionSuggestionBuilder(suggestZhName).prefix(keyword).size(100); 64 SuggestBuilder suggestBuilder = new SuggestBuilder() 65 .addSuggestion(suggestZhName, suggestZhNameBuilder); 66 SearchResponse suggestResponse = esClient.prepareSearch(CLUSTER_INDEX) 67 .setTypes(CLUSTER_TYPE) 68 // .setQuery(QueryBuilders.matchAllQuery()) 69 .suggest(suggestBuilder) 70 .execute() 71 .actionGet(); 72 73 List<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> result1 = suggestResponse 74 .getSuggest().getSuggestion(suggestZhName).getEntries(); 75 for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> op : result1) { 76 List<? extends Suggest.Suggestion.Entry.Option> options = op.getOptions(); 77 if (suggestList.size() < number) { 78 for (Suggest.Suggestion.Entry.Option pp : options) { 79 if(suggestList.size() < number && !suggestList.contains(pp.getText().toString())){ 80 suggestList.add(pp.getText().toString()); 81 } 82 } 83 }else{ 84 break; 85 } 86 } 87 88 return suggestList; 89 } 90 91 }
以上是关于Elasticsearch 5.4.3实战--Java API调用:搜索建议的主要内容,如果未能解决你的问题,请参考以下文章
mac 下搭建Elasticsearch 5.4.3分布式集群