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 }
时间: 2024-12-07 12:01:26

Elasticsearch 5.4.3实战--Java API调用:搜索建议的相关文章

Elasticsearch 5.4.3实战--Java API调用:搜索

ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. 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

Hbase java API 调用详解

Hbase java API 调用 一. hbase的安装 参考:http://blog.csdn.net/mapengbo521521/article/details/41777721 二.hbase访问方式 Native java api:最常规最高效的访问方式. Hbase shell:hbase的命令行工具,最简单的接口,适合管理员使用 Thrift gateway:利用thrift序列化结束支持各种语言,适合异构系统在线访问 Rest gateway:支持rest风格的http api

spark2.x由浅入深深到底系列六之RDD java api调用scala api的原理

RDD java api其实底层是调用了scala的api来实现的,所以我们有必要对java api是怎么样去调用scala api,我们先自己简单的实现一个scala版本和java版本的RDD和SparkContext 一.简单实现scala版本的RDD和SparkContext class RDD[T](value: Seq[T]) {   //RDD的map操作   def map[U](f: T => U): RDD[U] = {     new RDD(value.map(f))   

elasticsearch java API 实现搜索样例

查看cluster.version:curl 'centos1:9200'插入:curl -XPUT 'http://localhost:9200/dept/employee/1' -d '{ "empname": "emp1"}'查看index:curl 'centos1:9200/_cat/indices?v'查看1条内容:curl 'centos1:9200/dept/employee/1?pretty'查看所有内容:curl 'centos1:9200/de

Elasticsearch java api 基本搜索部分详解

版权声明:本文非原创文章,转载出处:http://blog.csdn.net/molong1208/article/details/50512149 一.所使用版本的介绍 使用的是elasticsearch2.1.0版本,在此只是简单介绍搜索部分的api使用 二.简单的搜索 使用api的时候,基本上可以将DSL搜索的所有情况均写出来,在此给出一个最简单搜索的全部的过程以及代码,之后将对不同的搜索只是针对函数进行介绍 (1)DSL搜索 对于最简单的DSL搜索,对一个词进行搜索使用url直接进行通信

ElasticSearch(十二) Bool Query JAVA API

Bool Query 用于组合多个叶子或复合查询子句的默认查询 must 相当于 与 & = must not 相当于 非 ~   != should 相当于 或  |   or  filter  过滤 boolQuery() .must(termQuery("content", "test1")) .must(termQuery("content", "test4")) .mustNot(termQuery(&quo

Elasticsearch 5.1.1搜索高亮及Java API实现

5.1.1的搜索高亮和2.X有所变化,但是变化不大.下面分四步来介绍:创建索引(设置mapping/IK分词).索引文档.REST API的搜索高亮.JAVA API的搜索高亮. 注:从这篇博客开始,采用简写的代码风格,也就是Sence插件或者kibana的dev tools中采用的风格.(温馨提示:安装kibana 5.1.1,在dev tools中直接可以使用简单格式命令.) 一.创建索引 文档结构为blog/article/id.先创建一个空的index: PUT blog 创建mappi

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

ElasticSearch Java Api -创建索引

ElasticSearch JAVA API官网文档:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-index.html 一.生成JSON 创建索引的第一步是要把对象转换为JSON字符串.官网给出了四种创建JSON文档的方法: 1.1手写方式生成 String json = "{" + "\"user\":\"kimchy\"