`
donlianli
  • 浏览: 340935 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Elasticsearch...
浏览量:218841
社区版块
存档分类
最新评论

ElasticSearch入门-搜索如此简单

阅读更多

转载请标明出处:http://donlianli.iteye.com/blog/1904064

 

搜索引擎我也不是很熟悉,但是数据库还是比较了解。可以把搜索理解为数据库的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的更多内容,请查看我的专栏:http://www.iteye.com/blogs/subjects/elasticsearch-tutor

对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
关于我:邯郸人,擅长Java,Javascript,Extjs,oracle sql。
更多我之前的文章,可以访问 我的空间

 

4
2
分享到:
评论
4 楼 empireghost 2014-09-19  
QueryBuilder query = QueryBuilders.fieldQuery("desc", "丸"); 

丸  换成 人参  

怎么查不出结果??
3 楼 jiuyuehe 2014-05-28  
这是个入门好例子。但是es是如何封装lucene 中权重的?
2 楼 c297186864 2013-07-12  
虽然没用过但是  还是不错 支持下
1 楼 dacoolbaby 2013-07-12  
不错,可以研究一下~~

相关推荐

    7.17.1系列Elasticsearch的elasticsearch-analysis-ik分词器

    elasticsearch-analysis-ik 是一个常用的中文分词器,在 Elasticsearch 中广泛应用于中文文本的分析和搜索。下面是 elasticsearch-analysis-ik 分词器的几个主要特点: 中文分词:elasticsearch-analysis-ik 是基于...

    最新版 elasticsearch-analysis-ik-8.7.0.zip

    最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip

    elasticsearch-x-content-6.3.0-API文档-中文版.zip

    赠送jar包:elasticsearch-x-content-6.3.0.jar; 赠送原API文档:elasticsearch-x-content-6.3.0-javadoc.jar; 赠送源代码:elasticsearch-x-content-6.3.0-sources.jar; 赠送Maven依赖信息文件:elasticsearch-x...

    elasticsearch-x-content-6.3.0-API文档-中英对照版.zip

    赠送jar包:elasticsearch-x-content-6.3.0.jar; 赠送原API文档:elasticsearch-x-content-6.3.0-javadoc.jar; 赠送源代码:elasticsearch-x-content-6.3.0-sources.jar; 赠送Maven依赖信息文件:elasticsearch-x...

    elasticsearch-analysis-dynamic-synonym-7.2.0

    Elasticsearch(ES)是一款功能强大的全文搜索引擎,广泛应用于数据检索、数据分析等领域。为了提高搜索的准确性和便利性,Elasticsearch提供了丰富的分析插件,其中"elasticsearch-analysis-dynamic-synonym-7.2.0...

    elasticsearch-analysis-ik-7.10.0.zip下载

    Elasticsearch是一个强大的开源搜索引擎和分析引擎,广泛应用于大数据处理和实时分析领域。"elasticsearch-analysis-ik"是针对Elasticsearch的一个中文分词插件,它的主要功能是提供高效、精准的中文分词能力,使得...

    elasticsearch-analysis-pinyin-7.4.0 es拼音分词器7.4.0

    Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于大数据领域的全文检索。它以其高可扩展性、实时性能以及丰富的分析能力著称。在中文环境下,由于汉字的复杂性,分词是实现有效搜索的关键步骤。为此,...

    最新版elasticsearch-analysis-ik-8.8.2.zip

    最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip

    elasticsearch-analysis-ik-8.11.0

    Elasticsearch Analysis IK 8.11.0 是一个专为Elasticsearch 8.11.0版本设计的中文分词插件,其主要目标是提供对中文文本的高效、精确的分词能力,以提升搜索引擎的索引质量和查询效果。这个插件分为粗粒度和细粒度...

    elasticsearch-analysis-ik-7.16.3.zip

    在现代大数据分析和搜索引擎领域,Elasticsearch(ES)因其高效、灵活的全文检索能力而备受青睐。然而,对于中文这样的多字节语言,如何准确地进行分词是关键。这时,我们就需要引入专门的中文分词器。本文将详细...

    elasticsearch-analysis-pinyin-7.17.24

    elasticsearch-analysis-pinyin-7.17.24

    elasticsearch-analysis-pinyin-7.10.1 elasticsearch-analysis-ik-7

    Elasticsearch是一个强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。在中文处理方面,它需要依赖特定的分词插件来对文本进行有效的索引和搜索。在给定的标题和描述中,提到了两个重要的插件:"elastic...

    elasticsearch-analysis-ik-7.4.2.zip.7z

    安装elasticsearch-analysis-ik-7.4.2插件的过程相对简单。首先,需要确保你的Elasticsearch服务已经正常运行。然后,可以通过Elasticsearch的bin目录下的`plugin`命令行工具进行安装,或者使用解压后的zip文件手动...

    elasticsearch-analysis-ik-7.10.2.zip

    Elasticsearch(ES)作为一个开源的全文搜索引擎,因其强大的搜索功能和分布式特性而备受青睐。然而,对于中文这种复杂的语言,分词是搜索引擎理解文本的关键步骤。本文将详细介绍elasticsearch-analysis-ik-7.10.2...

    elasticsearch-analysis-dynamic-synonym-7.6.2

    Elasticsearch(ES)作为一款强大的全文搜索引擎,同样支持对同义词的处理。`elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义...

    elasticsearch-analysis-ik-7.16.2.zip

    《Elasticsearch分词器:elasticsearch-analysis-ik-7.16.2深度解析》 在信息爆炸的时代,搜索引擎的效能成为了数据检索的关键。Elasticsearch作为一款强大的开源搜索引擎,其灵活性和可扩展性备受青睐。而在中文...

    最新版elasticsearch-analysis-ik-8.8.1.zip

    最新版elasticsearch-analysis-ik-8.8.1.zip最新版elasticsearch-analysis-ik-8.8.1.zip最新版elasticsearch-analysis-ik-8.8.1.zip最新版elasticsearch-analysis-ik-8.8.1.zip

    elasticsearch-jieba-plugin 8.8.2.zip

    Elasticsearch(ES)是一款强大的全文搜索引擎,广泛应用于大数据分析、日志检索、内容推荐等领域。然而,对于中文处理,Elasticsearch的默认配置并不理想,因为它内置的分词器主要针对英文。为了更好地支持中文搜索...

    elasticsearch-6.8.0+elasticsearch-analysis-ik-6.8.0 .zip

    Spring Data 提供的注解使得操作 Elasticsearch 如同操作数据库一样简单,提高了开发效率。 **搜索引擎的构建:** 构建基于 Elasticsearch 的搜索引擎涉及以下步骤: 1. **安装与配置**:部署 Elasticsearch 集群...

    最新版 elasticsearch-analysis-ik-7.9.3.zip

    Elasticsearch作为一个强大的全文搜索引擎,其灵活性和可扩展性深受开发者喜爱。然而,对于中文处理,Elasticsearch原生支持并不理想,这时就需要借助于插件来实现,其中最常用的便是`elasticsearch-analysis-ik`。...

Global site tag (gtag.js) - Google Analytics