搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的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. Objective-C中系统宏的用法总结

    先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等 宏变量: 先举一个例子,会用到上面这些宏: #define mypri ...

  2. C#基础篇--文件(流)

    1:Path类是专门用来操作文件路径的(Path类是静态类):当然用字符串的处理办法也能实现.  string str = @"C:\Users\成才\Desktop\Hashtable.t ...

  3. centos7支持ntfs

    简单搜索了一下,发现一个很好的安装步骤,简洁有效,已经试验. rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release- ...

  4. [记录]Ubuntu下,使用Shell,简单替换有规律的文件名称

    因工作中需要将Flash转为Html5,并且要有动画效果,我将Flash的组件导出Png序列,然后将Png序列拼接成一张雪碧图(Sprite),名字为在生成雪碧图可以排序,需要改成数字名称. 而名字是 ...

  5. AndroidStudio学习记录

    AndroidStudio学习记录 1. 插件的使用. plugins.jetbrains.com插件网站. 2. 目录介绍: 1.Studio中有Project和Module的概念,前面说到Stud ...

  6. [转]十年前的老文:以 Linux 的名义

    一.灰姑娘的狂欢 今年初,林纳斯·托瓦兹承认:“如果在12年前,有人告诉我Linux会发展到今天的模样,我肯定会惊得目瞪口呆.” 托瓦兹说的是实话.1991年,这名21岁的芬兰赫尔辛基大学的学生,偶然 ...

  7. Java项目经验

    Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...

  8. 启用Win8(中文版/核心版)中被阉割的远程桌面服务端

    Windows 8/8.1 标准版(中文版/核心版)中取消了远程桌面服务端,想通过远程连接到自己的电脑就很麻烦了,第三方远程桌面速度又不理想(如TeamViewer).通过以下方法可让系统恢复远程桌面 ...

  9. IO流详解(半教材类型)

    这两天学习了IO流,整理了一些理论知识点,仅供参考. java流概述 一 流 从操作系统层面和文件系统,数据保存相关的是所有语言都具备的一个基本功能,java专门开发了一个包:java.io.*;ja ...

  10. 使用c#生成Identicon图片

    Identicon是什么 我们在站点注册的时候通常系统会在我们没有提供自定义头像时为我们指定一个默认的头像,不过,样子千篇一律很是难看.聪明的程序员想了很多办法来解决这个问题,比如你能在这里看到很漂亮 ...