ElasticSearch概述、优点、测试(二)

ElasticSearch概述、优点、测试

一、为什么要用ElasticSearch

1、数据库查询缺点

​ 数据越大, 查询效率越低;(数据库的解决方案是建立索引, 但是使用前模糊查询,会导致索引失效)

**查询数据库总量:**35万数据量,用时10秒左右。

**使用模糊查询JAVA:**模糊查询,用时8秒左右。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIelqzRd-1574239592702)(....\Resource\images\4.1数据库使用模糊查询.png)]

2、ES使用优势
  1. 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
  2. 实时分析的分布式搜索引擎。
    分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;负载再平衡和路由在大多数情况下自动完成。
  3. 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)
  4. 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。

与数据库相较而言: 解决数据库中数据量过大同时模糊查询会导致数据库索引失效,查询效率低的问题.

参考:https://blog.csdn.net/Orangesss_/article/details/82260749

二、相关概念理解

1、逻辑层面
  • Index (索引):这里的 Index 是名词,一个 Index 就像是传统关系数据库的 Database,它是 Elasticsearch 用来存储数据的逻辑区域
  • Document (文档):Elasticsearch 使用 JSON 文档来表示一个对象,就像是关系数据库中一个 Table 中的一行数据
  • Type (类型):文档归属于一种 Type,就像是关系数据库中的一个 Table
  • Field (字段):每个文档包含多个字段,类似关系数据库中一个 Table 的列
ElasticsearchMySQL
IndexDatabase
TypeTable
DocumentRow
FieldColumn
2、物理层面
  • Node (节点):node 是一个运行着的 Elasticsearch 实例,一个 node 就是一个单独的 server
  • Cluster (集群):cluster 是多个 node 的集合
  • Shard (分片):数据分片,一个 index 可能会存在于多个 shard

三、端口的区别及作用

Elasticsearch 启动后,也启动了两个端口 9200 和 9300:

  • 9200 端口:HTTP RESTful 接口的通讯端口
  • 9300 端口:TCP 通讯端口,用于集群间节点通信和与 Java 客户端通信的端口

四、ES相关使用demo

1、elasticsearch.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">

    <!-- 搜索DAO 扫描 -->
    <elasticsearch:repositories base-package="com.couragehe.dao" />

    <!-- 配置ES客户端的连接-->
    <elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300"/>

    <!-- 配置ES模板  -->
    <bean id="elasticsearchTemplate"
          class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
        <constructor-arg name="client" ref="client" />
    </bean>
    <!-- 配置service扫描 -->
    <context:component-scan base-package="com.couragehe.service"/>
</beans>

2、配置maven依赖
	<!-- transport客户端 -->
		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>transport</artifactId>
			<version>5.6.8</version>
		</dependency>
		<!-- elasticsearch包 -->
		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>5.6.8</version>
		</dependency>
		<!-- Spring data与elasticSearch结合的包 给各种数据访问提供统一的编程接口 -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-elasticsearch</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>
		<!-- Spring测试包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>5.1.0.RELEASE</version>
		</dependency>
3、ES实体JavaBean
@Document(indexName ="item",type="item")
public class Item {
	@Id
	@Field(index = true,store = true,type = FieldType.Integer)
	private Integer id; 		
	@Field(index = true,analyzer = "ik_smart",searchAnalyzer = "ik_smart",store = true,type = FieldType.text)
	private String jobname; 					                   		
	@Field(index = true,analyzer = "ik_smart",searchAnalyzer = "ik_smart",store = true,type = FieldType.text)
	private String content;
	public Integer getId() {
		return id;
	}
	public void setId(Integer i) {
		this.id = i;
	}
	public String getJobname() {
		return jobname;
	}
	public void setJobname(String jobname) {
		this.jobname = jobname;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	@Override
	public String toString() {
		return "Item [id=" + id + ", jobname=" + jobname + ", content=" + content + "]";
	}
}

4、测试ES的类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:application-elasticsearch.xml")
public class TestSearch {
	@Autowired
	private JobService jobService;
	@Autowired
	private ElasticsearchTemplate elasticsearchTemplate;
	
	@Before
	public void init() {
		
	}
	//创建索引和映射
	@Test
	public void createIndex() {
		this.elasticsearchTemplate.createIndex(Item.class);
		this.elasticsearchTemplate.putMapping(Item.class);
	}
	//新增
	@Test
	public void TestSave() {
		Item item = new Item();
		item.setId(1234561);
		item.setJobname("Java工程师1");
		item.setContent("房租减半,水电全免1");
		this.jobService.save(item);
	}
	//修改,和新增的代码一样,如果id存在则是修改,不存在就是新增
	@Test
	public void TestUpdata() {
		Item item = new Item();
		item.setId(1234561);
		item.setJobname("Java工程师111");
		item.setContent("房租减半,水电全免111");
		this.jobService.save(item);
	}
	//删除
	@Test
	public void TestDelete() {
		Item item = new Item();
		item.setId(1234561);
		this.jobService.delete(item);
	}
	//批量保存
	
	@Test
	public void TestSaveAll() {
		//创建集合
		List<Item> list = new ArrayList<Item>();
		//封装数据
		for(int i = 0;i<100;i++) {
			Item item = new Item();
			item.setId(1234561+i);
			item.setJobname("Java工程师111"+i);
			item.setContent("房租减半,水电全免111"+i);
			list.add(item);
		}
		//批量保存
		this.jobService.saveAll(list);
	}
	//查询所有数据
	@Test
	public void testFindAll() {
		Iterable<Item> items = this.jobService.findAll();
		for(Item item:items) {
			System.out.println(item);
		}
	}
	//分页查询数据
	@Test 
	public void testFindByPage() {
		Page<Item> items = this.jobService.findByPage(1,10);
		for(Item item:items) {
			System.out.println(item);
		}
	}
	
	//复杂查询
	//根据title和Content进行查询,交集
	@Test
	public void TestFindByJobnameAndContent() {
		List<Item> list = this.jobService.findByJobnameAndContent("11122","11122");
		for(Item item:list) {
			System.out.println(item);
		}
	}
	//根据title和Content进行查询,并集
	@Test
	public void TestFindByJobnameOrContent() {
		List<Item> list = this.jobService.findByJobnameOrContent("11122","11123");
		for(Item item:list) {
			System.out.println(item);
		}		
	}
	//根据title或者content和id的范围 进行分页查询
	@Test
	public void TestFindByJobnameAndContentAndIdBetween() {
		Page<Item> items = this.jobService.findByJobnameAndContentAndIdBetween("Java工程师111","房租减半,水电全免111",12345610, 12345616,1,3);
		for(Item item:items) {
			System.out.println(item);
		}
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,构建在Apache Lucene库之上。它提供了一个分布式存储、搜索和分析大规模数据的解决方案,具有高性能、可扩展性和强大的全文搜索功能。 作为一个实时的分布式搜索引擎,Elasticsearch能够快速地存储、检索和分析海量数据。它使用倒排索引(Inverted Index)的数据结构来实现高效的全文搜索,支持复杂的查询和聚合操作。 以下是一些关键特性和用途: 1. 分布式架构:Elasticsearch采用分布式架构,可以水平扩展,通过将数据分散存储在多个节点上来提高性能和容错性。 2. 实时搜索和分析:Elasticsearch能够在毫秒级别实现实时搜索和分析,使得用户能够快速获取到最新的数据和结果。 3. 多种查询支持:Elasticsearch支持全文搜索、精确匹配、模糊查询、范围查询、聚合查询等多种查询方式,可以满足各种复杂的搜索需求。 4. 多种数据类型支持:Elasticsearch支持处理不同类型的数据,包括文本、数值、地理位置、日期等。它能够自动识别字段类型,并提供相应的搜索和分析功能。 5. 分布式数据处理:Elasticsearch提供了丰富的分布式数据处理功能,包括索引、更新、删除、批量操作、数据复制和故障转移等。 6. 可扩展性和高可用性:Elasticsearch支持水平扩展,可以通过添加更多的节点来处理更大规模的数据。它还提供了数据备份和故障转移机制,以确保数据的高可用性和可靠性。 Elasticsearch广泛应用于各种场景,如日志分析、实时监控、电商搜索、推荐系统、企业搜索等。它的强大搜索和分析能力使得用户能够快速从海量数据中获取有价值的信息和洞察。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值