在lucene里面,suggest 的支持非常完善,可以随心所欲的定制;

但是在es中使用起来就没有那么方便了。

es给suggest 分类4类:term ;phrase; completion; context;

目前最新版本是es1.2.1 这一块也还在不断完善中;

term suggester 是根据某词元在制定的字段中出现的频次来做出提示;

phrase suggester 是给term 上做了加强;

这里不做使用方法介绍;

链接地址:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-term.html

剩下的是completion 、context suggester。

这两个的使用与上面个使用方法完全不一样,上面都在查询的时候根据制定字段内容来做提示,而这两种是需要在mapping 里面定制suggester字段。使用时完全匹配时提示;

completion suggester 官方文档

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

文档讲解的非常全面,遗憾的是没有代码,这里把代码加上java client;

1:设置mapping 中的suggester

@Test
public void createQucikIndecs() throws IOException{
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject()
.startObject("pingzhuang")
.startObject("properties")
.startObject("id").field("type", "long").field("store", "yes").field("index", "not_analyzed").endObject()
.startObject("name").field("type", "string").field("store", "no").field("indexAnalyzer", "ik").field("searchAnalyzer", "ik").endObject()
.startObject("suggest").field("type","completion").field("index_analyzer","simple").field("search_analyzer","simple").field("payloads","true").endObject()
.endObject()
.endObject()
.endObject();
ESHandler.createQuickIndices("chinamedic", "pingzhuang", mapping, "formedic");
}

2: 设置好了以后,在做索引的时候每次都应该添加提示

@Test
public void addIndex(){
String json="{\"id\":44,\"name\":\"老狼-白衣飘飘的年代\",\"suggest\":{\"input\":\"老狼-白衣飘飘的年代\"}}";
String json1="{\"id\":42,\"name\":\"老狼-郎心似铁\",\"suggest\":{\"input\":\"老狼-郎心似铁\"}}";
String json2="{\"id\":43,\"name\":\"老狼-流浪歌手的请人\",\"suggest\":{\"input\":\"老狼-流浪歌手的请人\"}}";
ESHandler.addOneIndex("chinamedic","pingzhuang", json);
ESHandler.addOneIndex("chinamedic","pingzhuang", json1);
ESHandler.addOneIndex("chinamedic","pingzhuang", json2);
System.out.println();
}

3: 然后就是查询获得提示了

/**
* 搜索建议,自动补全搜索结结果
* @param indices 索引库名称
* @param prefix 搜索前缀词
* @return 建议列表
*/
public static List<String> getCompletionSuggest(String indices,
String prefix) {
CompletionSuggestionBuilder suggestionsBuilder = new CompletionSuggestionBuilder(
"complete");
suggestionsBuilder.text(prefix);
suggestionsBuilder.field("suggest");
suggestionsBuilder.size(10);
SuggestResponse resp = client.prepareSuggest(indices)
.addSuggestion(suggestionsBuilder).execute().actionGet();
List<? extends Entry<? extends Option>> list = resp.getSuggest()
.getSuggestion("complete").getEntries();
List<String> suggests = new ArrayList<String>();
if (list == null) {
return null;
} else {
for (Entry<? extends Option> e : list) {
for (Option option : e) {
suggests.add(option.getText().toString());
}
}
return suggests;
}
}

ok,到这里一个简单的completion suggester 就完成了。

后续再添加更多高级的使用示例。

elasticsearch suggest 的几种使用-completion 的基本 使用的更多相关文章

  1. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  2. [ES]elasticsearch章5 ES的分词(二)

    Elasticsearch 中文搜索时遇到几个问题: 当搜索关键词如:“人民币”时,如果分词将“人民币”分成“人”,“民”,“币”三个单字,那么搜索该关键词会匹配到很多包含该单字的无关内容,但是如果将 ...

  3. Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...

  4. Elasticsearch Suggester 学习

    suggester搜索就像百度搜索框中的提示类似. Elasticsearch 中提供类似的搜索功能. 答案就在Suggesters API. Suggesters基本的运作原理是将输入的文本分解为t ...

  5. 如何用 Node.js 和 Elasticsearch 构建搜索引擎

    Elasticsearch 是一款开源的搜索引擎,由于其高性能和分布式系统架构而备受关注.本文将讨论其关键特性,并手把手教你如何用它创建 Node.js 搜索引擎. Elasticsearch 概述 ...

  6. 使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能

    最近用了几天时间为公司项目集成了全文搜索引擎,项目初步目标是用于搜索框的即时提示.数据需要从MySQL中同步过来,因为数据不小,因此需要考虑初次同步后进行持续的增量同步.这里用到的开源服务就是Elas ...

  7. ES系列十三、Elasticsearch Suggester API(自动补全)

    1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...

  8. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

  9. java课程设计之--Elasticsearch篇

    一.团队课程设计博客链接 https://www.cnblogs.com/Rasang/p/12169899.html 二.个人负责模块或任务说明 2.1Elasticsearch简介 Elastic ...

随机推荐

  1. JS高程3.基本概念(5)语句

    1.if语句 2.do-while语句:后测循环语句,循环体内的代码至少执行一次. 3.while语句:前测循环语句. 4.for语句:前测循环语句. 注意:在ECMAScript中不存在块级作用域, ...

  2. 前端HTML规范

    HTML规范 - 整体结构 文件应以“<!DOCTYPE ......>”首行顶格开始,推荐使用“<!DOCTYPE html>”. 必须申明文档的编码charset,且与文件 ...

  3. 你所不知的 CSS ::before 和 ::after 伪元素用法

    CSS 有两个说不上常用的伪类 :before 和 :after,偶尔会被人用来添加些自定义格式什么的,但是它们的功用不仅于此.前几天发现了 Creative Link Effects 这个非常有意思 ...

  4. Android开发6:Service的使用(简单音乐播放器的实现)

    前言 啦啦啦~各位好久不见啦~博主最近比较忙,而且最近一次实验也是刚刚结束~ 好了不废话了,直接进入我们这次的内容~ 在这篇博文里我们将学习Service(服务)的相关知识,学会使用 Service ...

  5. SharePoint项目实践中如何实现非打破继承看上去很美的权限控制

    首先对于比较机密的数据,打破继承还是必须要的. 但是对于一些普通申请单据,虽然客户也希望用户不要看到其他人的申请单据,但是我还是不推荐打破继承,应为打破继承一方面会造成网站的权限管理特别的凌乱,另一方 ...

  6. 你真的了解UITabBarController吗?

    一:首先查看一下关于UITabBarController的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITabBarController : UIViewCo ...

  7. mac osx get postgresql path

    sudo lsof -i :5433 ps xuwww -p 91 sudo port install py27-psycopg2

  8. AtomicInteger源码注释

    AtomicInteger源码 在java.util.concurrent.atomic包下提供了大量的原子类,这里以AtomicInteger源码为例,添加了一些注释,个人理解,供参考: 其中比较重 ...

  9. SQL Server删除distribution数据库

    在数据库服务器删除复制(发布订阅)后,如何删除掉数据库distribution呢?如果你通过SSMS工具去删除数据库distribution,你会发现根本没有删除选项. 下面介绍一下删除distrib ...

  10. 使用logminer挖掘日志,分析历史操作 系列一

    ===============STARTED==================================== 事件起因: 业务的人mail过来说是有张表记录的10K+的优惠码记录没了,要我们确 ...