搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的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;
}
对这类话题感兴趣?欢迎发送邮件至donlianli@126.com;或者关注我的微信公众号“猿界汪汪队”
关于我:邯郸人,擅长Java,Javascript,Extjs,oracle sql。

ElasticSearch入门-搜索如此简单的更多相关文章

  1. ElasticSearch入门-搜索(java api)

    ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...

  2. 和我一起打造个简单搜索之ElasticSearch入门

    本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...

  3. 《读书报告 -- Elasticsearch入门 》--简单使用(2)

    <读书报告 – Elasticsearch入门 > ' 第四章 分布式文件存储 这章的主要内容是理解数据如何在分布式系统中存储. 4.1 路由文档到分片 创建一个新文档时,它是如何确定应该 ...

  4. 《读书报告 -- Elasticsearch入门 》-- 安装以及简单使用(1)

    <读书报告 – Elasticsearch入门 > 第一章 Elasticsearch入门 Elasticsearch是一个实时的分布式搜索和分析引擎,使得人们可以在一定规模上和一定速度上 ...

  5. ElasticSearch 5学习(4)——简单搜索笔记

    空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...

  6. ElasticSearch入门系列(七)搜索

    一.在之前,我们已经学会了如何使用elasticsearch作为一个简单的NoSql风格的分布式文件存储器--我们可以将一个JSON文档扔给Elasticsearch.也可以根据ID检索他们.但Ela ...

  7. Elasticsearch 数据搜索篇·【入门级干货】

    ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的相关应用.虽然不能让你理解ES的原理设计,但是可以帮助你理解ES,探寻更多的 ...

  8. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...

  9. ElasticSearch入门 附.Net Core例子

    1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...

随机推荐

  1. Android_Dialog

    layout.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  2. 如何实现XA式、非XA式Spring分布式事务

    Spring应用的几种事务处理机制 Java Transaction API和XA协议是Spring常用的分布式事务机制,不过你可以选择选择其他的实现方式.理想的实现取决于你的应用程序使用何种资源,你 ...

  3. 使用ueditor时候修改图片路径及其相关信息

    ueditor功能比较强大  使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是co ...

  4. PHP代码安全学习笔记V1.0

    PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html

  5. Fortify对移动应用安全的支持

    Fortify对移动应用安全的支持http://www.docin.com/p-768827684.html

  6. CI框架中自定义view文件夹位置

    要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...

  7. 【原】Spring与MongoDB集成:配置

    MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现.但是并没有提供DBObject与BeanObject的转换.在还没有了解到与 ...

  8. WordPress 后台提示输入FTP信息

    Wordpress 安裝主題時,需要輸入ftp訊息 參考了:WordPress后台更新提示输入FTP信息 ,解決方法是: 方法一.通過ssh 對wordpress 項目的文件夾賦權限 sudo cho ...

  9. 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...

  10. 类似微博菜单 ,用swift语言编写

    自定义tabar搭载界面1.-自定义标题按钮_如图  2.10-导航条按钮封装 演示如下 源代码下载DSWeibo.zip