Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅 仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的 数据)进行索引、搜索、排序、过滤
Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索 引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这 个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索 引。
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来 定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可 以为评论数据定义另一个类型
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等, 这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据 对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好。
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然, 也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存 在的互联网数据交互格式。
在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须 被索引/赋予一个索引的type。
1.创建配置
@Test public void createIndex() throws Exception { //1.创建一个Setting对象,相当于是一个配置信息。主要配置集群的名称。 Settings settings = Settings.builder() .put("cluster.name","my-application") //es配置文件 .yml 里面的名字 .build(); //2.创建一个客户端Client对象 TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));//TransportClient的访问端口是9300! //3.使用Client对象创建一个索引库 client.admin().indices().prepareCreate("index_hello").get(); //4.关闭Client对象 client.close(); }
效果如下
2.创建映射(就是一种类型的格式)
//创建映射(映射的格式类型) @Test public void setMappings() throws Exception { Settings settings = Settings.builder() .put("cluster.name", "my-application") .build(); //创建一个TransPortClient对象 TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); 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(); }
3.建立文档 (把各种文章 按照映射关系写入)
//建立文档document-------------------------------------------------------- @Test public void testAddDocument2() throws Exception { Settings settings = Settings.builder() .put("cluster.name", "my-application") .build(); //创建一个TransPortClient对象 TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));, //创建一个Article对象 for (int i = 5; i < 15; i++) { Article article = new Article(); //设置对象的属性 article.setId(i); article.setTitle(i+"降级!20日起北京市突发公共卫生应急响应级别由二级调整为三级"); article.setContent(i+"北京市人民政府副秘书长陈蓓在19日举行的北京市新冠肺炎疫情防控工作新闻发布会上宣布:7月20日零时起,北京市突发公共卫生应急响应级别由二级调整为三级。(记者盖博铭、王晓洁)"); //把article对象转换成json格式的字符串。 ObjectMapper objectMapper = new ObjectMapper(); String jsonDocument = objectMapper.writeValueAsString(article); System.out.println(jsonDocument); //使用client对象把文档写入索引库 client.prepareIndex("index_hello","article", String.valueOf(i)) .setSource(jsonDocument, XContentType.JSON) .get(); } //关闭客户端 client.close(); }
分页查询
//查询------------------------------------------------------------------------ @Test public void testQueryByTerm() throws Exception { //创建一个QueryBuilder对象 //参数1:要搜索的字段 //参数2:要搜索的关键词 QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "北京市"); //执行查询 search(queryBuilder); } public void search(QueryBuilder queryBuilder) throws Exception { //执行查询 SearchResponse searchResponse = client.prepareSearch("index_hello") .setTypes("article") .setQuery(queryBuilder) //设置分页信息 .setFrom(0) //每页显示的行数 .setSize(5) .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()); //取文档的属性 System.out.println("-----------文档的属性"); Map<String, Object> document = searchHit.getSource(); System.out.println(document.get("id")); System.out.println(document.get("title")); System.out.println(document.get("content")); } //关闭client client.close(); }
高亮
//高亮查询-------------------------------------------------- @Test public void testQueryHLight() throws Exception { //创建一个QueryBuilder对象 //参数1:要搜索的字段 //参数2:要搜索的关键词 QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "北京市"); //执行查询 Hsearch(queryBuilder,"title"); } private void Hsearch(QueryBuilder queryBuilder, String highlightField) throws Exception { HighlightBuilder highlightBuilder = new HighlightBuilder(); //高亮显示的字段 highlightBuilder.field(highlightField); highlightBuilder.preTags("<em>"); highlightBuilder.postTags("</em>"); //执行查询 SearchResponse searchResponse = client.prepareSearch("index_hello") .setTypes("article") .setQuery(queryBuilder) //设置分页信息 .setFrom(0) //每页显示的行数 .setSize(5) //设置高亮信息 .highlighter(highlightBuilder) .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()); //取文档的属性 System.out.println("-----------文档的属性"); Map<String, Object> document = searchHit.getSource(); System.out.println(document.get("id")); System.out.println(document.get("title")); System.out.println(document.get("content")); System.out.println("************高亮结果"); Map<String, HighlightField> highlightFields = searchHit.getHighlightFields(); System.out.println(highlightFields); //取title高亮显示的结果 HighlightField field = highlightFields.get(highlightField); Text[] fragments = field.getFragments(); if (fragments != null) { String title = fragments[0].toString(); System.out.println(title); } } //关闭client client.close(); }
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域 为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层
实体Article
@Document(indexName = "sdes_blog", type = "article") public class Article { @Id @Field(type = FieldType.Long, store = true) private long id; @Field(type = FieldType.text, store = true, analyzer = "ik_smart") private String title; @Field(type = FieldType.text, store = true, analyzer = "ik_smart") private String content; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "Article{" + "id=" + id + ", title=‘" + title + ‘\‘‘ + ", content=‘" + content + ‘\‘‘ + ‘}‘; } }
elasticsearch映射创建查询 和Spring Data ElasticSearch入门
原文:https://www.cnblogs.com/july7/p/13342034.html