技术标签: ElasticSearch Solr 全文检索 搜索引擎 # java 学习汇总 ES
windows
和linux
下的启动命令。elasticsearch
图标,即可执行成功,如果在linux环境下,则选择linux下的sh运行文件。如图所示:node -v
查看版本检查是否安装成功。)
它是运行在node.js上的,所以我们需要安装它。
npm install -g grunt-cli
npm install
grunt server
head是指的刚才下载的head插件。
http.cors.enabled: true
http.cors.allow-origin: "*"
Relational DB -> Databases -> Tables -> Rows -> Columns
ElasticSearch -> Indices -> Types -> Documents -> Fields
使用图形化界面创建索引:
使用postman创建名称为:blog
的索引:
使用mapping
创建带field的索引:
创建索引后设置Mapping信息(创建type后为指定type设置mapping):
图形化界面直接删除:
使用postman删除索引:
之前新增索引是
put
请求,所以此处删除索引则将请求改为delete
,然后指定的索引名称不变即可删除。
返回了需要查询的数据,说明添加成功!
delete
,然后url中提供索引
、类型
、文档id
,即可删除。图示如下:删除的是
_id
这个,而不是内容中的id。_id
这个才是文档的真正主键。
修改文档跟新增的方式一样。如果此_id数据已存在,则会先删除老数据,然后再添加新的数据。如果此_id不存在,则会进行新增。
指定了index/type/field,所以能够查询到指定的文档数据。
query条件任意写,default_field指代默认搜索域。它会先将查询的query内容先进行分词,然后再在默认的搜索域上进行查询。
标准分词器:
可以看到它是一个中文分成了每个字一个词,这不是我们想要的效果。我们需要的效果是:我、是、程序、程序员。
如何解决?
IK分词器简介:
使用IK分词器效果:
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
分词结果为: 我,是,程序,程序员
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&text=我是程序员
分词结果为: 我,是,程序,程序员,员。 说明它的拆分结果更细,分词结果更多。
ik分词器的使用:
不删除会导致集群搭建不成功
主要配置了节点名称和端口号。
pom.xml中引入es的依赖:
创建测试类并创建索引库:
public class ElasticSearchClientTest{
@Test
public void createIndex() throws Exception{
//1. 创建一个Settings对象,相当于是一个配置信息。主要配置集群的名称。
Settings settings= Settings.builder()
.put("cluster.name","my-elasticsearch")
.build();
// 2. 创建一个客户端Client对象
TransportClient client= new PrebuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
// 3. 使用client对象创建一个索引库
client.admin().indices().prepareCreate("index_hello")'
// 执行操作
.get();
// 4. 关闭client对象
client.close();
}
}
@Test
public void setMappings() throws Exception{
//1. 创建一个Settings对象,相当于是一个配置信息。主要配置集群的名称。
Settings settings= Settings.builder()
.put("cluster.name","my-elasticsearch")
.build();
// 2. 创建一个客户端Client对象
TransportClient client= new PrebuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
// 3. 创建一个Mappings信息
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type","long")
.field("store",true)
.endObject()
.startObject("title")
.field("type","text")
.field("store",true)
.field("analyzer","ik_smart")
.endObject()
.startObject("content")
.field("type","text")
.field("store",true)
.field("analyzer","ik_smart")
.endObject()
.endObject()
.endObject()
.endObject()
// 使用client把mapping信息设置到索引库中
client.admin().indices()
// 设置要做映射的索引
.preparePutMapping("index_hello")
// 设置要做映射的type
.setType("article")
// mapping信息,可以是XContentBuilder对象可以是json格式的字符串
.setSource(builder)
// 执行操作
.get();
// 关闭连接
client.close();
}
public class ElasticSearchClientTest{
private TransportClient client;
@Before
public void init() throws Exception{
// 创建一个Settings对象
Settings settings = Settings.builder().put("cluster.name","my-elasticsearch").build();
// 创建一个TransPortClient对象
TransportClient client= new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
}
}
这样子在每次类被实例化之前就会自动init初始化client内的内容了。
@Test
public void testAddDocument() throws Exception{
// 创建一个文档对象
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("id",1l)
.field("title","这是数据的标题")
.field("content","这是数据的内容")
.endObject();
// 把文档对象添加到索引库
client.prepareIndex()
// 设置索引名称
.setIndex("index_hello")
// 设置type
.setType("article")
// 设置文档的id,如果不设置的话会自动生成一个
.setId("id")
// 设置文档信息
.setSource(builder)
// 执行操作
.get();
// 关闭客户端
client.close();
}
public class SearchIndexTest{
private TransportClient client;
@Before
public void init() throws Exception{
// 创建一个Settings对象
Settings settings = Settings.builder().put("cluster.name","my-elasticsearch").build();
// 创建一个TransPortClient对象
TransportClient client= new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
}
@Test
public void testSearchById() throws Exception{
// 创建一个查询对象
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1","2");
// 执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
.setTypes("article")
.setQuery(queryBuilder)
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
// 取查询结果的总记录数
System.out.println("查询结果总记录数:"+ searchHits.getTotalHits());
// 查询结果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
// 打印文档对象,以json格式输出
System.out.println(searchHit.getSourceAsString());
// 取文档的属性
Map<String,Object> document = searchHit.getSource();
System.out.println(document.get("id0"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
}
}
@Test
public void testQueryByTerm() throws Exception{
// 创建一个QueryBuilder对象
// 参数1: 要搜索的字段
// 参数2: 要搜索的关键词
QueryBuilder queryBuilder = QueryBuilders.termQuery("title","北方")
// 执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
.setTypes("article")
.setQuery(queryBuilder)
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
// 取查询结果的总记录数
System.out.println("查询结果总记录数:"+ searchHits.getTotalHits());
// 查询结果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
// 打印文档对象,以json格式输出
System.out.println(searchHit.getSourceAsString());
// 取文档的属性
Map<String,Object> document = searchHit.getSource();
System.out.println(document.get("id0"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
}
@Test
public void testQueryStringQuery() throws Exception {
// 创建一个QueryBuilder对象
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("速度与激情").defaultField("title");
// 执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
.setTypes("article")
.setQuery(queryBuilder)
.get();
// 取查询结果
SearchHits searchHits = searchResponse.getHits();
// 取查询结果的总记录数
System.out.println("查询结果总记录数:"+ searchHits.getTotalHits());
// 查询结果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while(iterator.hasNext()){
SearchHit searchHit = iterator.next();
// 打印文档对象,以json格式输出
System.out.println(searchHit.getSourceAsString());
// 取文档的属性
Map<String,Object> document = searchHit.getSource();
System.out.println(document.get("id0"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
}
// 执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
.setTypes("article")
.setQuery(queryBuilder)
// 设置分页信息
.setFrom(0)
// 每页显示的行数
.setSize(5)
.get();
什么是Spring Data?
什么是Spring Data ElasticSearch?
搭建步骤:
spring:
application:
name: es-application
data:
elasticsearch:
cluster-nodes: 192.168.227.136:9300
cluster-name: elasticsearch
推荐此方案
它继承了ElasticSearchRepository,里面会提供一些常用的方法
创建索引:
添加文档:
删除文档:
更新文档:
它会把原来的这个id匹配的文档给删除掉,然后再新增,就实现了类似更新的功能。
查询指定id的文档和查询所有:
自定义查询方法,我们需要根据SpringDataES 的命名规则来命名,这样我们定义了接口就会自动实现功能。如果我们没有实现分页的话,无论es中匹配的有多少条数据,最多也只会默认给我们返回10条。如果需要指定分页,可以使用上面的带分页查询方式。
直接使用章节5.5
中的查询方式,查询的内容比如:“我是程序员”,那么它不会再将结果进行分词,所以匹配的结果是我是程序员这个原子词汇。如果要对查询条件再分词,比如我是程序员分词,能够匹配到:我、是、程序、程序员、员的所有数据,我们需要使用queryString方式进行查询。
大致步骤:
代码演示:
@Test
public void testNativeSearchQuery() throws Exception{
// 创建一个查询对象
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQUery("Maven是一个构建工具").defaultField("title"))
.withPageable(PageRequest.of(0,15))
.build();
// 执行查询
List<Article> articleList = template.queryForList(query,Article.class);
articleList.forEach(a-> System.out.println(a))
}
稍微麻烦点,但是功能更强,灵活性更高
文章浏览阅读3.4k次,点赞8次,收藏42次。一、什么是内部类?or 内部类的概念内部类是定义在另一个类中的类;下面类TestB是类TestA的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class TestA{ class TestB {}}二、 为什么需要内部类?or 内部类有什么作用?1、 内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。2、内部类可以对同一个包中的其他类隐藏起来。3、 当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。三、 内部类的分类成员内部_成员内部类和局部内部类的区别
文章浏览阅读118次。分布式系统要求拆分分布式思想的实质搭配要求分布式系统要求按照某些特定的规则将项目进行拆分。如果将一个项目的所有模板功能都写到一起,当某个模块出现问题时将直接导致整个服务器出现问题。拆分按照业务拆分为不同的服务器,有效的降低系统架构的耦合性在业务拆分的基础上可按照代码层级进行拆分(view、controller、service、pojo)分布式思想的实质分布式思想的实质是为了系统的..._分布式系统运维工具
文章浏览阅读174次。1.数据源准备2.数据处理step1:数据表处理应用函数:①VLOOKUP函数; ② CONCATENATE函数终表:step2:数据透视表统计分析(1) 透视表汇总不同渠道用户数, 金额(2)透视表汇总不同日期购买用户数,金额(3)透视表汇总不同用户购买订单数,金额step3:讲第二步结果可视化, 比如, 柱形图(1)不同渠道用户数, 金额(2)不同日期..._exce l趋势分析数据量
文章浏览阅读3.3k次。堡垒机可以为企业实现服务器、网络设备、数据库、安全设备等的集中管控和安全可靠运行,帮助IT运维人员提高工作效率。通俗来说,就是用来控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事后溯源)。由于堡垒机内部保存着企业所有的设备资产和权限关系,是企业内部信息安全的重要一环。但目前出现的以下问题产生了很大安全隐患:密码设置过于简单,容易被暴力破解;为方便记忆,设置统一的密码,一旦单点被破,极易引发全面危机。在单一的静态密码验证机制下,登录密码是堡垒机安全的唯一_horizon宁盾双因素配置
文章浏览阅读7.7k次,点赞4次,收藏16次。Chrome作为一款挺不错的浏览器,其有着诸多的优良特性,并且支持跨平台。其支持(Windows、Linux、Mac OS X、BSD、Android),在绝大多数情况下,其的安装都很简单,但有时会由于网络原因,无法安装,所以在这里总结下Chrome的安装。Windows下的安装:在线安装:离线安装:Linux下的安装:在线安装:离线安装:..._chrome linux debian离线安装依赖
文章浏览阅读153次。中国发达城市榜单每天都在刷新,但无非是北上广轮流坐庄。北京拥有最顶尖的文化资源,上海是“摩登”的国际化大都市,广州是活力四射的千年商都。GDP和发展潜力是衡量城市的数字指...
文章浏览阅读3.3k次。前言spark在java使用比较少,多是scala的用法,我这里介绍一下我在项目中使用的代码配置详细算法的使用请点击我主页列表查看版本jar版本说明spark3.0.1scala2.12这个版本注意和spark版本对应,只是为了引jar包springboot版本2.3.2.RELEASEmaven<!-- spark --> <dependency> <gro_使用java调用spark注册进去的程序
文章浏览阅读4.8k次。汽车零部件开发工具巨头V公司全套bootloader中UDS协议栈源代码,自己完成底层外设驱动开发后,集成即可使用,代码精简高效,大厂出品有量产保证。:139800617636213023darcy169_uds协议栈 源代码
文章浏览阅读4.6k次,点赞20次,收藏148次。AUTOSAR基础篇之OS(下)前言首先,请问大家几个小小的问题,你清楚:你知道多核OS在什么场景下使用吗?多核系统OS又是如何协同启动或者关闭的呢?AUTOSAR OS存在哪些功能安全等方面的要求呢?多核OS之间的启动关闭与单核相比又存在哪些异同呢?。。。。。。今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCXrdI0k-1636287756923)(https://gite_autosar 定义了 5 种多核支持类型
文章浏览阅读2.2k次,点赞6次,收藏14次。原因:自己写的头文件没有被加入到方案的包含目录中去,无法被检索到,也就无法打开。将自己写的头文件都放入header files。然后在VS界面上,右键方案名,点击属性。将自己头文件夹的目录添加进去。_vs2013打不开自己定义的头文件
文章浏览阅读3.3w次,点赞80次,收藏342次。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从Redis 中查找相应的Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。_redis命令
文章浏览阅读449次,点赞3次,收藏3次。URP的设计目标是在保持高性能的同时,提供更多的渲染功能和自定义选项。与普通项目相比,会多出Presets文件夹,里面包含着一些设置,包括本色,声音,法线,贴图等设置。全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,主光源和附加光源在一次Pass中可以一起着色。URP:全局只有主光源和附加光源,主光源只支持平行光,附加光源数量有限制,一次Pass可以计算多个光源。可编程渲染管线:渲染策略是可以供程序员定制的,可以定制的有:光照计算和光源,深度测试,摄像机光照烘焙,后期处理策略等等。_urp渲染管线