文档章节

ElasticSearch入门-搜索如此简单

Galy_绿
 Galy_绿
发布于 2015/12/15 17:41
字数 874
阅读 80
收藏 5

搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的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 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();

Client client = new TransportClient(settings)

.addTransportAddress(new InetSocketTransportAddress("192.168.1.106", 9300));

return client;

}


本文转载自:http://blog.sina.com.cn/s/blog_673cbc8a010191sj.html

Galy_绿
粉丝 12
博文 133
码字总数 14908
作品 0
海淀
私信 提问
Elasticsearch入门篇——基础知识

还记得大二的时候,初入Java大门,就大言不惭的给老师说,我要开发一个搜索引擎,结果是各种学习,各种找资料,终于在期末的时候,做出了一个简单新闻搜索页面,搜索模块是使用了Lucene。 今...

JAVA_冯文议
03/11
205
0
elasticsearch入门到放弃之elasticsearch-in-java

代码地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-elasticsearch 在java中使用自带的api操作。你可以先看下elasticsearch入门到放弃之docker搭建......

zhaoyunxing
07/05
0
0
Elasticsearch与Solr搜索引擎选型调研文档

Elasticsearch ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开...

小海bug
2018/06/28
258
0
elasticsearch入门到放弃之spring boot elasticsearch x-pack

spring-boot-data-elasticsearch 代码地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-elasticsearch/spring-boot-data-elasticsearch 这个就跟我在......

zhaoyunxing
07/07
0
0
【开源访谈】Elastic 曾勇:我与 Elasticsearch 的共同成长之路

Elasticsearch 由于其简单易用且能够解决实际的问题,从最开始的分布式搜索引擎到如今遍地开花的各种应用场景,Elasticsearch 正成为大数据分析的热门工具。Elasticsearch 是如何在国内发展起...

达尔文
2017/05/23
4.6K
12

没有更多内容

加载失败,请刷新页面

加载更多

UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
2分钟前
1
0
MySQL的5种时间类型的比较

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00 TIMESTAMP 4 bytes YYYY-MM......

物种起源-达尔文
9分钟前
3
0
云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参...

阿里云官方博客
12分钟前
1
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
17分钟前
1
0
6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下: 根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。 1、地图区域划分(腾讯地图) 1.1、H...

有一个小阿飞
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部