Elasticsearch 5.4.3实战--Java API调用:搜索建议
通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示。 那么这个功能在elasticsearch中如何实现呢?
Elasticsearch里设计了4种类别的Suggester,分别是:
- Term Suggester
- Phrase Suggester
- Completion Suggester
- Context Suggester
我是采用Completion Suggester来实现的。
原理的文章网上有很多,这里不多说。我们直接上代码:
package com.cs99lzzs.elasticsearch.service.imp; import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import javax.annotation.Resource; import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; @Service("productSearchService")
public class ProductSearchServiceImp implements ProductSearchService { private static Logger logger = Logger.getLogger(ProductSearchService.class); private static String aggrationBrandName = "brand_count"; private static String suggestZhName = "suggestName"; @Resource(name="esClient")
Client esClient; @Value("${elasticsearch.index}")
private String CLUSTER_INDEX; @Value("${elasticsearch.type}")
private String CLUSTER_TYPE; /**
* @return
*/
@Override
public List<String> getSuggestList(String keyword, int number) {
List<String> suggestList = new ArrayList<String>(); CompletionSuggestionBuilder suggestZhNameBuilder = new CompletionSuggestionBuilder(suggestZhName).prefix(keyword).size(100);
SuggestBuilder suggestBuilder = new SuggestBuilder()
.addSuggestion(suggestZhName, suggestZhNameBuilder);
SearchResponse suggestResponse = esClient.prepareSearch(CLUSTER_INDEX)
.setTypes(CLUSTER_TYPE)
// .setQuery(QueryBuilders.matchAllQuery())
.suggest(suggestBuilder)
.execute()
.actionGet(); List<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> result1 = suggestResponse
.getSuggest().getSuggestion(suggestZhName).getEntries();
for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> op : result1) {
List<? extends Suggest.Suggestion.Entry.Option> options = op.getOptions();
if (suggestList.size() < number) {
for (Suggest.Suggestion.Entry.Option pp : options) {
if(suggestList.size() < number && !suggestList.contains(pp.getText().toString())){
suggestList.add(pp.getText().toString());
}
}
}else{
break;
}
} return suggestList;
} }
Elasticsearch 5.4.3实战--Java API调用:搜索建议的更多相关文章
- Elasticsearch 5.4.3实战--Java API调用:索引mapping创建
因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理, 所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...
- Elasticsearch 5.4.3实战--Java API调用:搜索
ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...
- Elasticsearch 5.4.3实战--Java API调用:批量写入数据
这个其实比较简单,直接上代码. 注意部分逻辑可以换成你自己的逻辑 package com.cs99lzzs.elasticsearch.service.imp; import java.sql.Tim ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- elasticsearch(一):JAVA api操作
1.创建一个mavan项目,项目的以来配置如下. <?xml version="1.0" encoding="UTF-8"?> <projec ...
- ElasticSearch入门-增删改查(java api)
1.增加Index PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(g ...
- JAVA Api 调用Hbase报错锦集
1. 报错 java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/protobuf/generated/MasterProtos$Master ...
- java api 调用es集群(1.7版本)
public static void main(String[] args) { Settings settings = ImmutableSettings.settingsBuilder() // ...
- Zookeeper Java API调用
引入zookeeper-3.4.11.jar public class ZooKeeperTest implements Watcher{ //public final static String z ...
随机推荐
- collections 数据结构模块namedtuple
namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...
- Python package下载中遇到ReadTimeoutError: HTTPSConnectionPool?
问题描述: Python package下载中遇到ReadTimeoutError: HTTPSConnectionPool? 问题解决: 方法1:继续重复下载 pip install virtual ...
- 使用rvm安装与切换Ruby
列出已知的 Ruby 版本 rvm list known安装一个 Ruby 版本 rvm install 2.3.1 --disable-binary这里安装了最新的 2.2.0, rvm list ...
- Problems found loading plugins: Plugin "GlassFish Integration" was not loaded: required plugin "Java EE: EJB, JPA, Servlets" is disabled.
idea启动报错:并且无法部署web项目 Problems found loading plugins: Plugin "GlassFish Integration" was no ...
- Mcafee(麦咖啡) 无法升级的解决办法(威流验证)
McAfee时会遇到更新失败的情况.为了解决这个问题,你需要做如下设置:1.“运行”>“dcomcnfg.exe”2.双击“组件服务>计算机>我的电脑”3.展开“DCOM配置”,打开 ...
- 外部程序调用Django模块的解决办法
Question django.core.exceptions.ImproperlyConfigured: Requested setting CACHES, but settings are not ...
- Elasticsearch入门之从零开始安装ik分词器
起因 需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷.我们来看个实例: POST ...
- mybatis字符串转义问题
问题描述 @Select("select * from account order by #{orderBy} #{orderRule} limit #{start},#{offset}&q ...
- Android弹出窗口
protected void PopUp() { final PopupWindow popup = new PopupWindow(TestActivity.this); View popView ...
- exec存储过程示例
假如存储过程为test,两个参数为aa,bb那么有以下两种写法,不要带括号EXEC [dbo].[test] @aa = 111, @bb = 222 exec test 111,222