当前位置:   article > 正文

ElasticSearch操作入门_es增加list类型的字段,名为tags,xcontentbuilder.startobject应该

es增加list类型的字段,名为tags,xcontentbuilder.startobject应该怎么写

ElasticSearch操作入门

1 目标

  • 创建文档(JSON/Map)
  • ES数据搜索

2 讲解

2.1 工程搭建

(1)创建Maven工程

工程坐标如下:


  1. <groupId>com.itheima</groupId>
  2. <artifactId>elasticsearch-day1-demo1</artifactId>
  3. <version>1.0-SNAPSHOT</version>

(2)pom.xml


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>elasticsearch-day1-demo1</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <!--ES包-->
  11. <dependency>
  12. <groupId>org.elasticsearch</groupId>
  13. <artifactId>elasticsearch</artifactId>
  14. <version>5.6.8</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.elasticsearch.client</groupId>
  18. <artifactId>transport</artifactId>
  19. <version>5.6.8</version>
  20. </dependency>
  21. <!--日志包-->
  22. <dependency>
  23. <groupId>org.apache.logging.log4j</groupId>
  24. <artifactId>log4j-to-slf4j</artifactId>
  25. <version>2.9.1</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.slf4j</groupId>
  29. <artifactId>slf4j-api</artifactId>
  30. <version>1.7.24</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.slf4j</groupId>
  34. <artifactId>slf4j-simple</artifactId>
  35. <version>1.7.21</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>log4j</groupId>
  39. <artifactId>log4j</artifactId>
  40. <version>1.2.12</version>
  41. </dependency>
  42. <!--测试包-->
  43. <dependency>
  44. <groupId>junit</groupId>
  45. <artifactId>junit</artifactId>
  46. <version>4.12</version>
  47. </dependency>
  48. </dependencies>
  49. </project>

2.2 新建索引+添加文档

使用创建索引(index)+类型(type)+自动创建映射(Elasticsearch帮助我们根据存储的字段自动建立映射,后续讲完分词器后,手动建立映射)

(1)基于jsonBuilder创建索引

创建测试类com.itheima.test.ElasticsearchTest,并在类中创建testCreateIndexJsonDemo1方法,实现创建索引,代码如下:


  1. /***
  2. * 组织Document数据(使用ES的api构建json)
  3. */
  4. @Test
  5. public void testCreateIndexJsonDemo1() throws Exception {
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. //构建文档对象
  20. XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
  21. builder.field("id",1);
  22. builder.field("title","ElasticSearch是一个基于Lucene的搜索服务器。");
  23. builder.field("content","它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。");
  24. builder.endObject();
  25. //使用TransportClient对象创建文档
  26. client.prepareIndex("blog1","article","1").setSource(builder).get();
  27. //关闭资源
  28. client.close();
  29. }

访问<http://localhost:9100/>,效果如下:

(2)使用Map创建索引

在测试类com.itheima.test.ElasticsearchTest,中创建testCreateIndexMapDemo2方法,实现创建索引,代码如下:


  1. /***
  2. * 使用Map创建索引
  3. */
  4. @Test
  5. public void testCreateIndexMapDemo2() throws Exception {
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的TCP通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. //构建文档对象
  20. Map<String,Object> map = new HashMap<String,Object>();
  21. map.put("id",2);
  22. map.put("title","2-ElasticSearch是一个基于Lucene的搜索服务器");
  23. map.put("content","2-它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。");
  24. //使用TransportClient对象创建文档
  25. client.prepareIndex("blog1","article","2").setSource(map).get();
  26. //关闭资源
  27. client.close();
  28. }

访问<http://localhost:9100/>,效果如下:

2.3 搜索文档数据

(1)根据ID查询(不走索引)


  1. /***
  2. * 根据ID查询
  3. */
  4. @Test
  5. public void testQueyById() throws Exception{
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. //查询数据
  20. GetResponse response = client.prepareGet("blog1", "article", "1").get();
  21. //获取结果集数据
  22. String result = response.getSourceAsString();
  23. System.out.println(result);
  24. }

此时直接根据ID查询,不会走索引域,直接根据ID定位数据,执行后结果如下:

{"id":1,"title":"ElasticSearch是一个基于Lucene的搜索服务器。","content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。"}

(2)查询全部(不走索引)


  1. /***
  2. * 查询所有,不走索引
  3. */
  4. @Test
  5. public void testQueryAll() throws Exception{
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. /**
  20. * 搜索数据
  21. */
  22. SearchResponse response = client
  23. .prepareSearch("blog1")
  24. .setTypes("article")
  25. .setQuery(QueryBuilders.matchAllQuery()) //设置查询条件,QueryBuilders.matchAllQuery()查询所有
  26. .get();
  27. //处理结果
  28. SearchHits hits = response.getHits();
  29. //总记录数
  30. long totalHits = hits.getTotalHits();
  31. //获取数据结果集
  32. Iterator<SearchHit> iterator = hits.iterator();
  33. while (iterator.hasNext()){
  34. //获取数据
  35. SearchHit hit = iterator.next();
  36. //获取指定域数据
  37. String title = hit.getSource().get("title").toString();
  38. //获取所有数据,并转成JSON字符串
  39. String result = hit.getSourceAsString();
  40. System.out.println(title);
  41. System.out.println(result);
  42. }
  43. }

查询所有数据,不走索引域,直接获取所有结果记录,控制台输出结果如下:


  1. 2-ElasticSearch是一个基于Lucene的搜索服务器
  2. {"id":2,"title":"2-ElasticSearch是一个基于Lucene的搜索服务器","content":"2-它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。"}
  3. ElasticSearch是一个基于Lucene的搜索服务器。
  4. {"id":1,"title":"ElasticSearch是一个基于Lucene的搜索服务器。","content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。"}

(3)字符串查询


  1. /***
  2. * 字符串查询
  3. */
  4. @Test
  5. public void testQueryByString() throws Exception{
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. /**
  20. * 搜索数据
  21. */
  22. SearchResponse response = client
  23. .prepareSearch("blog1")
  24. .setTypes("article")
  25. // 默认在所有的域上进行搜索,搜索“搜索”;如果添加.field("title"):表示只在title域进行搜索
  26. .setQuery(QueryBuilders.queryStringQuery("搜索").field("title"))
  27. .get();
  28. //处理结果
  29. SearchHits hits = response.getHits();
  30. //总记录数
  31. long totalHits = hits.getTotalHits();
  32. //获取数据结果集
  33. Iterator<SearchHit> iterator = hits.iterator();
  34. while (iterator.hasNext()){
  35. //获取数据
  36. SearchHit hit = iterator.next();
  37. //获取指定域数据
  38. String title = hit.getSource().get("title").toString();
  39. //获取所有数据,并转成JSON字符串
  40. String result = hit.getSourceAsString();
  41. System.out.println(title);
  42. System.out.println(result);
  43. }
  44. }

此时会走索引域,搜索结果如下:


  1. 2-ElasticSearch是一个基于Lucene的搜索服务器
  2. {"id":2,"title":"2-ElasticSearch是一个基于Lucene的搜索服务器","content":"2-它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。"}
  3. ElasticSearch是一个基于Lucene的搜索服务器。
  4. {"id":1,"title":"ElasticSearch是一个基于Lucene的搜索服务器。","content":"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。"}

(4)词条搜索


  1. /***
  2. * 词条查询
  3. */
  4. @Test
  5. public void testQueryByTerm() throws Exception{
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. /**
  20. * 搜索数据
  21. */
  22. SearchResponse response = client
  23. .prepareSearch("blog1")
  24. .setTypes("article")
  25. // 设置查询条件
  26. .setQuery(QueryBuilders.termQuery("title","搜索"))
  27. .get();
  28. //处理结果
  29. SearchHits hits = response.getHits();
  30. //总记录数
  31. long totalHits = hits.getTotalHits();
  32. //获取数据结果集
  33. Iterator<SearchHit> iterator = hits.iterator();
  34. while (iterator.hasNext()){
  35. //获取数据
  36. SearchHit hit = iterator.next();
  37. //获取指定域数据
  38. String title = hit.getSource().get("title").toString();
  39. //获取所有数据,并转成JSON字符串
  40. String result = hit.getSourceAsString();
  41. System.out.println(title);
  42. System.out.println(result);
  43. }
  44. //关闭资源
  45. client.close();
  46. }

搜不到结果:为什么?

(5)模糊查询(通配符查询)

*:表示所有的任意的多个字符组成

?:表示1个任意的字符


  1. /***
  2. * 通配符查询
  3. */
  4. @Test
  5. public void testQueryByKeyword() throws Exception{
  6. /***
  7. * 创建TransportClient对象
  8. * Settings:表示集群的设置
  9. * EMPTY:表示没有集群的配置
  10. * Settings.EMPTY:不使用集群
  11. */
  12. TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
  13. /****
  14. * 配置链接信息
  15. * 127.0.0.1:Elasticsearch的IP地址
  16. * 9300:Elasticsearch的通信端口
  17. */
  18. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
  19. /**
  20. * 搜索数据
  21. */
  22. SearchResponse response = client
  23. .prepareSearch("blog1")
  24. .setTypes("article")
  25. // 设置查询条件
  26. .setQuery(QueryBuilders.wildcardQuery("title","*搜索*"))
  27. .get();
  28. //处理结果
  29. SearchHits hits = response.getHits();
  30. //总记录数
  31. long totalHits = hits.getTotalHits();
  32. //获取数据结果集
  33. Iterator<SearchHit> iterator = hits.iterator();
  34. while (iterator.hasNext()){
  35. //获取数据
  36. SearchHit hit = iterator.next();
  37. //获取指定域数据
  38. String title = hit.getSource().get("title").toString();
  39. //获取所有数据,并转成JSON字符串
  40. String result = hit.getSourceAsString();
  41. System.out.println(title);
  42. System.out.println(result);
  43. }
  44. //关闭资源
  45. client.close();
  46. }

搜素不到结果。

词条查询和通配符查询不能查询到数据,为什么呢?

2.4 词条总结

词条: 就是将文本内容存入搜索服务器,搜索服务器进行分词之后的最小的词(不能再切分)

例如:“ElasticSearch是一个基于Lucene的搜索服务器”

​ 分词(好的): ElasticSearch、是、一个、基于、Lucene、搜索、服务、服务器 

​ 默认单字分词(差的): ElasticSearch、 是、一、个、基、于、搜、索、服、务、器

3 小结

  • 创建文档(JSON/Map)
  创建文档数据有2种方法,一种是JSON方式,另外一种是基于Map方式

 

  • ES数据搜索

  1. 根据ID搜索、搜索全部不走索引
  2. 字符串搜索、词条搜索、通配符搜索走索引
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/825934
推荐阅读
相关标签
  

闽ICP备14008679号