Elasticsearch使用
- 注意在es使用时要注意springBoot和spring-data-elasticsearch以及elasticsearch的版本对应关系
- es分词器
-
Analysis:文本分析–把全文文本转换为一系列单词的过程 。Analysis是通过Analuzer来实现 (分词就是将文档通过Analuzer分成一个一个的Term[关键词查询],每一个Term都指向包含这个Term的文档)
-
Analyzer组成:character filters , tokenizers , token filters
- character filters–字符过滤器,在文本进行分词之前,先进行预处理,比如过滤html标签
- tokenizers – 分词器, 英文分词根据空格将单词分开,中文采用机器学习算法分词
- token filters – Token过滤器 , 将切分的单词进行加工,比如大小写转换,去掉停用词,加入同义词
-
内置分词器
- Standard 默认分词器(英文按单词切分,并小写处理;中文单字分词)
- Simple 按照单词切分 (符号被过滤,小写处理;中文按照空格进行分词)
- Stop 小写处理(停用词过滤 a the is)
- Whitespace 按空格切分 (中英文按空格分词,不转小写)
- Keyword Analyzer 不分词(直接将输入当输出)
-
国内对中文友好分词,建议使用IK分词器 下载elasticsearch-analysis-ik.zip 版本要和elasticearch一致(ik_smart 粗颗粒; ik_max_word 细颗粒)
-
智能模式:对应es的IK插件的ik_smart,会做最粗粒度的拆分。比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
-
细粒度模式:对用es的插件ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。
-
-
springBoot整合
-
导入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
-
在配置文件
application.properties
中配置 ES 的相关参数spring: elasticsearch: uris: http://ip:9200
-
es对象映射(项目启动,es文档会自动生成)
参考连接:https://blog.csdn.net/chenxihua1/article/details/103311138
/** * 这个创建索引的过程,最主要是从 @Document 注解中的 createIndex = false 这个属性开始, *因为 createIndex默认是true, 所以项目启动的时候,默认就会初始化这个索引 *所以,就必须把它设置为 false。 */ //@Document定义在Elasticsearch中索引信息 @Document(indexName = "article", createIndex = false) @Data public class Article { @Id // @Id定义了Elasticsearch的_id private String id; // ik分词 细颗粒度 比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。 @Field(type = FieldType.Text,analyzer = "ik_max_word") // analyzer 分词类型 private String title; // ik分词 粗颗粒度 比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。 @Field(type = FieldType.Text,analyzer = "ik_smart") //@Field定义字段类型等信息 private String description; @Field(type = FieldType.Double) private Double price; @Field(type = FieldType.Nested,includeInParent = true) private List<Author> authors; }
注意:创建实体仓库:注意没有这一步,即便在实体上方设置@Document(indexName = “article”),springboot启动也不会创建mapping
-
创建接口Repository(ElasticsearchRepository接口定义了Elasticsearch的CRUD , 通过定义的方法名就能自动创建各种查询 , 跟 JpaRepository 类似)
@Repository public interface ArticleRepository extends ElasticsearchRepository<Article, String> { // findAll() 、save() 、 deleteById() }
-
controller
@RestController public class ArticleController { @Autowired private ArticleService articleService; @GetMapping("/findAll") public List<Article> findAllArticle(){ return articleService.findAllArticle(); } @PostMapping("/searchArticle/{params}") public List<Article> searchArticle(@PathVariable("params") String params){ return articleService.searchArticle(params); } }
-
service
@Service public class ArticleService { @Autowired private ArticleRepository articleRepository; public List<Article> findAllArticle() { Iterable<Article> all = articleRepository.findAll(); List<Article> articles = new ArrayList<>(); all.forEach( e-> { articles.add(e); }); return articles; } public List<Article> searchArticle(String params) { BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 文档 必须 匹配这些条件才能被包含进来。 boolQueryBuilder.must(QueryBuilders.matchQuery("title",params)); // 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。 boolQueryBuilder.should(QueryBuilders.matchQuery("description",params)); NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder() .withQuery(boolQueryBuilder); NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build(); SearchHits<Article> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, Article.class); List<Article> articles = new ArrayList<>(); searchHits.forEach(articleSearchHit -> { articles.add(articleSearchHit.getContent()); }); return articles; } }
-
参数查询语句,参考连接:https://www.cnblogs.com/eternityz/p/17039586.html
-