当前位置:   article > 正文

SpringBoot整合es_springboot 集成es

springboot 集成es

1、项目pom引入es相关依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>

2、application.yml配置文件新增es配置

  1. spring:
  2. elasticsearch:
  3. rest:
  4. uris: http://localhost:9200

3、代码注入模板类就可以使用es了

  1. @Autowired
  2. private ElasticsearchRestTemplate template;
  3. // 上述操作形式是ES早期的操作方式,使用的客户端被称为Low Level Client,
  4. 这种客户端操作方式性能方面略显不足,于是ES开发了全新的客户端操作方式,
  5. 称为High Level Client
  6. @Autowired
  7. private RestHighLevelClient client;

4、通过es接口操作es

基本操作

ES中保存有我们要查询的数据,只不过格式和数据库存储数据格式不同而已。在ES中我们要先创建倒排索引,这个索引的功能又点类似于数据库的表,然后将数据添加到倒排索引中,添加的数据称为文档。所以要进行ES的操作要先创建索引,再添加文档,这样才能进行后续的查询操作。

要操作ES可以通过Rest风格的请求来进行,也就是说发送一个请求就可以执行一个操作。比如新建索引,删除索引这些操作都可以使用发送请求的形式来进行

创建索引

  1. // 创建索引,books是索引名称,下同
  2. PUT请求 http://localhost:9200/books
  3. // 发送请求后,看到如下信息即索引创建成功
  4. {
  5. "acknowledged": true,
  6. "shards_acknowledged": true,
  7. "index": "books"
  8. }
  9. // 重复创建已经存在的索引会出现错误信息,reason属性中描述错误原因
  10. {
  11. "error": {
  12. "root_cause": [
  13. {
  14. "type": "resource_already_exists_exception",
  15. "reason": "index [books/VgC_XMVAQmedaiBNSgO2-w] already exists",
  16. "index_uuid": "VgC_XMVAQmedaiBNSgO2-w",
  17. "index": "books"
  18. }
  19. ],
  20. "type": "resource_already_exists_exception",
  21. "reason": "index [books/VgC_XMVAQmedaiBNSgO2-w] already exists", # books索引已经存在
  22. "index_uuid": "VgC_XMVAQmedaiBNSgO2-w",
  23. "index": "book"
  24. },
  25. "status": 400
  26. }

查询索引

  1. GET请求 http://localhost:9200/books
  2. // 返回
  3. {
  4. "books": {
  5. "aliases": {},
  6. "mappings": {},
  7. "settings": {
  8. "index": {
  9. "creation_date": "1691400465823",
  10. "number_of_shards": "1",
  11. "number_of_replicas": "1",
  12. "uuid": "YPioI8LDTyiZfpw3OnInwQ",
  13. "version": {
  14. "created": "7090399"
  15. },
  16. "provided_name": "books"
  17. }
  18. }
  19. }
  20. }
  21. // 如果查询了不存在的索引,会返回错误信息
  22. {
  23. "error": {
  24. "root_cause": [
  25. {
  26. "type": "index_not_found_exception",
  27. "reason": "no such index [book]",
  28. "resource.type": "index_or_alias",
  29. "resource.id": "book",
  30. "index_uuid": "_na_",
  31. "index": "book"
  32. }
  33. ],
  34. "type": "index_not_found_exception",
  35. "reason": "no such index [book]",
  36. "resource.type": "index_or_alias",
  37. "resource.id": "book",
  38. "index_uuid": "_na_",
  39. "index": "book"
  40. },
  41. "status": 404
  42. }

删除索引

  1. DELETE请求 http://localhost:9200/books
  2. // 返回
  3. {
  4. "acknowledged": true
  5. }
  6. // 如果重复删除,会给出错误信息
  7. {
  8. "error": {
  9. "root_cause": [
  10. {
  11. "type": "index_not_found_exception",
  12. "reason": "no such index [books]",
  13. "resource.type": "index_or_alias",
  14. "resource.id": "books",
  15. "index_uuid": "_na_",
  16. "index": "books"
  17. }
  18. ],
  19. "type": "index_not_found_exception",
  20. "reason": "no such index [books]",
  21. "resource.type": "index_or_alias",
  22. "resource.id": "books",
  23. "index_uuid": "_na_",
  24. "index": "books"
  25. },
  26. "status": 404
  27. }

创建索引并指定分词器:

前面创建的索引是未指定分词器的,可以在创建索引时添加请求参数,设置分词器。目前国内较为流行的分词器是IK分词器,使用前先在下对应的分词器,然后使用。

注意:IK分词器插件的版本要和ElasticSearch的版本一致

IK分词器下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

分词器下载后解压到ES安装目录的plugins目录中即可,安装分词器后需要重新启动ES服务器。

注意:下载的分词器压缩文件不能放在plugins目录中,解压后可以删掉

es启动日志出现如下信息说明ik分词器加载成功

使用IK分词器创建索引格式:

  1. PUT请求 http://localhost:9200/books
  2. 注意:创建索引必须是小写,不能使用_开头
  3. 请求参数如下(注意是json格式的参数)
  4. {
  5. "mappings":{ #定义mappings属性,替换创建索引时对应的mappings属性
  6. "properties":{ #定义索引中包含的属性设置
  7. "id":{ #设置索引中包含id属性
  8. "type":"keyword" #当前属性可以被直接搜索
  9. },
  10. "name":{ #设置索引中包含name属性
  11. "type":"text", #当前属性是文本信息,参与分词
  12. "analyzer":"ik_max_word", #使用IK分词器进行分词
  13. "copy_to":"all" #分词结果拷贝到all属性中
  14. },
  15. "type":{
  16. "type":"keyword"
  17. },
  18. "description":{
  19. "type":"text",
  20. "analyzer":"ik_max_word",
  21. "copy_to":"all"
  22. },
  23. "all":{ #定义属性,用来描述多个字段的分词结果集合,当前属性可以参与查询
  24. "type":"text",
  25. "analyzer":"ik_max_word"
  26. }
  27. }
  28. }
  29. }

目前我们已经有了索引了,但是索引中还没有数据,所以要先添加数据,ES中称数据为文档,下面进行文档操作

添加文档,有三种方式

  1. POST请求 http://localhost:9200/books/_doc #使用系统生成id
  2. POST请求 http://localhost:9200/books/_create/1 #使用指定id
  3. POST请求 http://localhost:9200/books/_doc/1 #使用指定id,不存在创建,存在更新(版本递增)
  4. 文档通过请求参数传递,数据格式json
  5. {
  6. "name":"springboot",
  7. "type":"springboot",
  8. "description":"springboot"
  9. }

查询文档

  1. GET请求 http://localhost:9200/books/_doc/1 #查询单个文档
  2. GET请求 http://localhost:9200/books/_search #查询全部文档

条件查询

  1. GET请求 http://localhost:9200/books/_search?q=name:springboot # q=查询属性名:查询属性值
  2. // 前缀匹配查询
  3. 概念:以xx开头的搜索,不计算相关度评分
  4. {
  5. "query": {
  6. "prefix": {
  7. "<field>": {
  8. "value": "<word_prefix>"
  9. }
  10. }
  11. }
  12. }
  13. // 模糊查询
  14. 混淆字符 (box → fox) 缺少字符 (black → lack)
  15. 多出字符 (sic → sick) 颠倒次序 (act → cat)
  16. {
  17. "query": {
  18. "fuzzy": {
  19. "<field>": {
  20. "value": "<keyword>"
  21. }
  22. }
  23. }
  24. }
  25. // 正则匹配查询
  26. 概念:regexp查询的性能可以根据提供的正则表达式而有所不同。
  27. 为了提高性能,应避免使用通配符模式,如.或 .?+未经前缀或后缀
  28. {
  29. "query": {
  30. "regexp": {
  31. "<field>": {
  32. "value": "<regex>",
  33. "flags": "ALL"
  34. }
  35. }
  36. }
  37. }
  38. flags说明:
  39. 1)ALL
  40. 启用所有可选操作符。
  41. COMPLEMENT
  42. 启用操作符。可以使用对下面最短的模式进行否定。例如
  43. a~bc # matches ‘adc’ and ‘aec’ but not ‘abc’
  44. 2)INTERVAL
  45. 启用<>操作符。可以使用<>匹配数值范围。例如
  46. foo<1-100> # matches ‘foo1’, ‘foo2’ … ‘foo99’, ‘foo100’
  47. foo<01-100> # matches ‘foo01’, ‘foo02’ … ‘foo99’, ‘foo100’
  48. 3)INTERSECTION
  49. 启用&操作符,它充当AND操作符。如果左边和右边的模式都匹配,则匹配成功。例如:
  50. aaa.+&.+bbb # matches ‘aaabbb’
  51. 4)ANYSTRING
  52. 启用@操作符。您可以使用@来匹配任何整个字符串。 您可以将@操作符与&和~操作符组合起来,创建一个“everything except”逻辑。例如:
  53. @&~(abc.+) # matches everything except terms beginning with ‘abc’
  54. // 通配符查询
  55. 概念:通配符运算符是匹配一个或多个字符的占位符。例如,*通配符运算符匹配零个或多个字符。
  56. 您可以将通配符运算符与其他字符结合使用以创建通配符模式。
  57. {
  58. "query": {
  59. "wildcard": {
  60. "<field>": {
  61. "value": "<word_with_wildcard>"
  62. }
  63. }
  64. }
  65. }

删除文档

DELETE请求	http://localhost:9200/books/_doc/1

修改文档(全量更新)

  1. PUT请求 http://localhost:9200/books/_doc/1
  2. 文档通过请求参数传递,数据格式json
  3. {
  4. "name":"springboot",
  5. "type":"springboot",
  6. "description":"springboot"
  7. }

修改文档(部分更新)

  1. POST请求 http://localhost:9200/books/_update/1
  2. 文档通过请求参数传递,数据格式json
  3. {
  4. "doc":{ #部分更新并不是对原始文档进行更新,而是对原始文档对象中的doc属性中的指定属性更新
  5. "name":"springboot" #仅更新提供的属性值,未提供的属性值不参与更新操作
  6. }
  7. }

查看分词算法

  1. GET请求 http://localhost:/_analyze
  2. // 请求体
  3. {
  4. "analyzer": "ik_max_word",
  5. "text": "斯提芬库里"
  6. }

5、自定义分词字典

用ik分词器分析的文本中不存在“芬库里”

如果我想加入“芬库里”,此时就需要配置自定义字典--即自定义词组群,就是在IK分词器字典中加入我们自定义的字典,在词典中加入想要的词。

(1)在ik分词器文件的config目录中新建自定义的字典文件,以.dic为后缀,并在文件中加入“芬库里”:

(2)在IKAnalyzer.cfg.xml配置文件中加入自定义的字典文件

(3)查看自定义分词字典是否生效

(4)创建索引时可以指定算法

  1. {
  2. "mappings":{
  3. "properties":{
  4. "name":{
  5. "type": "text",
  6. "analyzer":"ik_max_word"
  7. },
  8. "desc":{
  9. "type": "text",
  10. "analyzer":"ik_max_word"
  11. }
  12. }
  13. }
  14. }

有问题和建议欢迎大家留言评论,谢谢~

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号