ElasticSearch入门-搜索如此简单
搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的like功能的替代品。因为like有以下几点不足:
第一、like的效率不行,在使用like时,一般都用不到索引,除非使用前缀匹配,才能用得上索引。但普通的需求并非前缀匹配。
第二、like的不能做到完全的模糊匹配。比如like '%化痰冲剂%'就不能把”化痰止咳冲剂“搜索出来。但是普通的用户,需求就是这样
第三、like无法根据匹配度进行排序。数据库匹配某个关键字的记录可能有好几千,但是用户只能看100条,数据库往往返回用户一些不关心的记录。
种种原因导致搜索引擎的横空出世。
为了说明ES的搜索AIP及搜索功能,我们需要先造点数据。
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.client.Client; import com.donlianli.es.ESUtils;
import com.donlianli.es.model.LogModel; public class BulkIndexTest { public static void main(String[] args) {
String[] desc = new String[]{
"玉屏风口服液",
"清咽丸",
"四消丸",
"感冒清胶囊",
"人参归脾丸", "人参健脾丸",
"明目地黄丸",
"小儿咳喘灵颗粒",
"小儿化痰止咳冲剂",
"双黄连",
"六味地黄丸"
};
Client client = ESUtils.getClient();
int j= 0;
BulkRequestBuilder bulkRequest = client.prepareBulk();
for(int i=1000;i<1010;i++){
LogModel l = new LogModel();
l.setDesc(desc[j]);
j++;
String json = ESUtils.toJson(l);
IndexRequestBuilder indexRequest = client.prepareIndex("twitter", "tweet")
//指定不重复的ID
.setSource(json).setId(String.valueOf(i));
//添加到builder中
bulkRequest.add(indexRequest);
} BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
System.out.println(bulkResponse.buildFailureMessage());
}
}
}
LogModel的定义见ElasticSearch入门-增删改查(CRUD)
我们插入了10条记录到ES,别管ID是多少,只要不重就行。
下面,我们需要对LogModel的desc字段进行搜索。我们搜索一个最简单的”丸“字,我们希望将所有带丸字的记录都筛选出来。
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits; import com.donlianli.es.ESUtils; public class QuerySearchTest {
public static void main(String[] args) {
Client client = ESUtils.getClient();
QueryBuilder query = QueryBuilders.fieldQuery("desc", "丸");
SearchResponse response = client.prepareSearch("twitter")
.setTypes("tweet")
//设置查询条件,
.setQuery(query)
.setFrom(0).setSize(60)
.execute()
.actionGet();
/**
* SearchHits是SearchHit的复数形式,表示这个是一个列表
*/
SearchHits shs = response.getHits();
for(SearchHit hit : shs){
System.out.println("分数(score):"+hit.getScore()+", 业务描述(desc):"+
hit.getSource().get("desc"));
}
client.close();
} }
运行结果:
分数(score):2.97438, 业务描述(desc):四消丸
分数(score):2.7716475, 业务描述(desc):清咽丸
分数(score):2.6025825, 业务描述(desc):人参归脾丸
分数(score):2.6025825, 业务描述(desc):人参健脾丸
分数(score):2.4251914, 业务描述(desc):明目地黄丸
可以看到,搜索引擎已经将我们所有带丸的记录都筛选出来了。并且,字数最少的自动排在了最前面。是不是很智能。在完全没有配置ES任何东西之前,就能使用搜索功能了。
下面,我们再来试试搜索”小儿颗粒“,你猜会不会搜到记录呢?运行结果:
分数(score):4.46157, 业务描述(desc):小儿咳喘灵颗粒
分数(score):0.87699485, 业务描述(desc):小儿化痰止咳冲剂
嗯,不错,虽然没有完全匹配的,但相关记录都已经出来了。
至此,使用ES替代数据库的LIKE功能,基本上已经完成了。搜索的更多功能,探索ing。。。。
PS: ESUtils.getClient();就是一个静态方法,创建了一个ES的客户端。
public static Client getClient(){
Settings settings = ImmutableSettings.settingsBuilder()
//指定集群名称
.put("cluster.name", "elasticsearch")
//探测集群中机器状态
.put("client.transport.sniff", true).build();
/*
* 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象
* 用完记得要关闭
*/
Client client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));
return client;
}

ElasticSearch入门-搜索如此简单的更多相关文章
- ElasticSearch入门-搜索(java api)
ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...
- 和我一起打造个简单搜索之ElasticSearch入门
本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...
- 《读书报告 -- Elasticsearch入门 》--简单使用(2)
<读书报告 – Elasticsearch入门 > ' 第四章 分布式文件存储 这章的主要内容是理解数据如何在分布式系统中存储. 4.1 路由文档到分片 创建一个新文档时,它是如何确定应该 ...
- 《读书报告 -- Elasticsearch入门 》-- 安装以及简单使用(1)
<读书报告 – Elasticsearch入门 > 第一章 Elasticsearch入门 Elasticsearch是一个实时的分布式搜索和分析引擎,使得人们可以在一定规模上和一定速度上 ...
- ElasticSearch 5学习(4)——简单搜索笔记
空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...
- ElasticSearch入门系列(七)搜索
一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...
- Elasticsearch 数据搜索篇·【入门级干货】
ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...
- ElasticSearch入门知识扫盲
ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...
- ElasticSearch入门 附.Net Core例子
1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...
随机推荐
- Android_Dialog
layout.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...
- 如何实现XA式、非XA式Spring分布式事务
Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...
- 使用ueditor时候修改图片路径及其相关信息
ueditor功能比较强大 使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是co ...
- PHP代码安全学习笔记V1.0
PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html
- Fortify对移动应用安全的支持
Fortify对移动应用安全的支持http://www.docin.com/p-768827684.html
- CI框架中自定义view文件夹位置
要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...
- 【原】Spring与MongoDB集成:配置
MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现.但是并没有提供DBObject与BeanObject的转换.在还没有了解到与 ...
- WordPress 后台提示输入FTP信息
Wordpress 安裝主題時,需要輸入ftp訊息 參考了:WordPress后台更新提示输入FTP信息 ,解決方法是: 方法一.通過ssh 對wordpress 項目的文件夾賦權限 sudo cho ...
- 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货
写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...
- 类似微博菜单 ,用swift语言编写
自定义tabar搭载界面1.-自定义标题按钮_如图 2.10-导航条按钮封装 演示如下 源代码下载DSWeibo.zip