日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot整合Spring Data Elasticsearch

發布時間:2023/12/8 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot整合Spring Data Elasticsearch 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

特點:

  • 分布式,無需人工搭建集群(solr就需要人為配置,使用Zookeeper作為注冊中心)
  • Restful風格,一切API都遵循Rest原則,容易上手
  • 近實時搜索,數據更新在Elasticsearch中幾乎是完全同步的

倒排索引
倒排索引是引擎搜素的基礎;
在存文檔的時候,將數據進行分詞,并記錄每個分詞下的文檔編號,查找的通過分詞找到對應的倒排列表的數據
安裝es
點擊:官網下載es

  • 將下載的壓縮包解壓到自定義目錄即可

    執行該文件,瀏覽器訪問http://localhost:9200/
    Java程序訪問端口9300

    安裝Head插件
    elasticsearch-head相當于可視化工具
    此鏈接下載Head插件,解壓即可
    確保已安裝
    node及grunt

  • grunt下載:npm install -g grunt-cli

  • 通過npm run start 開啟

訪問localhost:9100

安裝IK分詞器
Elastic Search默認的分詞器是單個分詞,效果很差
下載 一定要選擇與Elastic Search版本同步

  • 將下載的Ik分詞器改名為ik放在elasticsearch的目錄下

  • 重啟es,如下圖成功

  • 在IKAnalyzer.cfg.xml中配置擴展詞和停用詞(根據需要)

SpringBoot整合Spring Data Elasticsearch

SpringDataElasticSearch是SpringData項目下的一個子模塊
SpringData的使命是給各種數據訪問提供統一的編程接口,不管是關系型數據庫(如MySQL),還是非關系數據庫(如Redis),或者類似Elasticsearch這樣的索引數據庫。從而簡化開發人員的代碼,提高開發效率。

  • 所需依賴
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>4.0.0.RELEASE</version></dependency>
  • application.yml配置文件
spring:data:elasticsearch:cluster-name: my-applicationcluster-nodes: 127.0.0.1:9300 # 程序連接es的端口號是9300


在SpringDataElasticSearch中,只需要操作對象,就可以操作elasticsearch中的數據

索引操作

  • 創建索引及映射

    • @Document 作用在類,標記實體類為文檔對象,一般有兩個屬性

      • indexName:對應索引庫名稱
      • type:對應在索引庫中的類型
      • shards:分片數量,默認5
      • replicas:副本數量,默認1
    • @Id 作用在成員變量,標記一個字段作為id主鍵

    • @Field 作用在成員變量,標記為文檔的字段,并指定字段映射屬性:

  • type:字段類型,是枚舉:FieldType,可以是text、long、short、date、integer、object等

    • text:存儲數據時候,會自動分詞,并生成索引
    • keyword:存儲數據時候,不會分詞建立索引
    • Numerical:數值類型,分兩類
      • 基本數據類型:long、interger、short、byte、double、float、half_float
      • 浮點數的高精度類型:scaled_float
        • 需要指定一個精度因子,比如10或100。elasticsearch會把真實值乘以這個因子后存儲,取出時再還原。
    • Date:日期類型
      • elasticsearch可以對日期格式化為字符串存儲,但是建議我們存儲為毫秒值,存儲為long,節省空間。
  • index:是否索引,布爾類型,默認是true

  • store:是否存儲,布爾類型,默認是false

  • analyzer:分詞器名稱,這里的ik_max_word即使用ik分詞器

POJO

@Data @AllArgsConstructor @NoArgsConstructor @Table(name = "student") @Document(indexName = "capgeminitest",type = "student") public class Student {@Id@Column(name = "id")@GeneratedValue(generator = "JDBC")private Integer id;@Field(type = FieldType.Text,analyzer = "ik_max_word")@Column(name = "sname")private String sname; }

測試

@RestController @RequestMapping("/stu") public class StudentController {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@GetMappingpublic void testEs(){// 創建索引elasticsearchTemplate.createIndex(Student.class);// 映射elasticsearchTemplate.putMapping(Student.class);Logger.getLogger("Esearch").info("創建索引測試成功");}@DeleteMappingpublic void testDelEs(){// 刪除索引elasticsearchTemplate.deleteIndex(Student.class);Logger.getLogger("Esearch").info("刪除索引測試成功");} }

  • 新增文檔數據
    Repository接口
    不用寫任何DAO處理,自動根據方法名或類的信息進行CRUD操作。只要你定義一個接口,然后繼承Repository提供的一些子接口
public interface StudentRepository extends ElasticsearchRepository<Student,Long> { }
  • 添加一個對象,批量添加
@RestController @RequestMapping("/stu") public class StudentController {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Autowiredprivate StudentRepository studentRepository;@GetMapping("/addAllStu")public void addAllStu(){Student student = new Student();student.setSname("李木子");Student student2 = new Student();student2.setSname("李七夜");ArrayList<Student> students = new ArrayList<>();students.add(student);students.add(student2);studentRepository.saveAll(students);Logger.getLogger("Esearch").info("批量新增對象測試成功");}@GetMapping("/addStu")public void addStu(){Student student = new Student();student.setSname("李淳罡");studentRepository.save(student);Logger.getLogger("Esearch").info("添加一個對象測試成功");} }

頁面查詢

沒有修改,需先刪除,再修改,根據id作為依據

查詢

查詢

  • 基本查詢
  • 分頁查詢
  • 排序查找
    ascending升序
    descending降序
  • 自定義方法(SpringData的功能,根據方法名自動實現功能)
KeywordSample
AndfindByTitleAndPricefindBy屬性名1And屬性名2
OrfindByTitleOrPrice
Is=findByTitle
NotfindByTitleNot
BetweenfindByPriceBetween
LessThanEqualfindByPriceLessThan
GreaterThanEqualfindByPriceGreaterThan
BeforefindByPriceBefore
AfterfindByPriceAfter
LikefindByNameLike
StartingWithfindByNameStartingWith
EndingWithfindByNameEndingWith
Contains/ContainingfindByNameContaining
InfindByNameIn(Collectionnames)
NotInfindByNameNotIn(Collectionnames)
NearfindByStoreNear
TruefindByAvailableTrue
FalsefindByAvailableFalse
OrderByfindByAvailableTrueOrderByNameDesc

自定義方法

- id在x-y之間 - id在x-y之間并倒序 - 模糊匹配
  • Repository
public interface StudentRepository extends ElasticsearchRepository<Student,Long> {/*** 根據id區間搜索*/public List<Student> findByidBetween(Integer id, Integer id2);/*** 模糊匹配* @param sname* @return*/public List<Student> findBySname(String sname);/*** id在xxx-yyy區間內的,并且根據id倒序排序輸出**/public List<Student> findByidBetweenOrderByIdDesc(Integer id, Integer id2);}
  • 測試
@RestController @RequestMapping("/stu") public class StudentController {@Autowiredprivate ElasticsearchTemplate elasticsearchTemplate;@Autowiredprivate StudentRepository studentRepository;/*** 基本查詢*/@GetMapping("/queryAll")public void query(){Iterable<Student> all = studentRepository.findAll();Iterator<Student> iterator = all.iterator();while (iterator.hasNext()){EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info(""+iterator.next());}}/*** 分頁查詢* @param page 頁數* @param size 數量*/@GetMapping("/limitPage")public void findPage(int page, int size){Page<Student> all = studentRepository.findAll(PageRequest.of(page, size));for (Student student : all) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("分頁:"+student);}EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("總條數"+all.getTotalElements());EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("總頁數"+all.getTotalPages());}/*** 排序查詢*/@GetMapping("/findAllOrder")public void findAllOrder(){// 降序Iterable<Student> id = studentRepository.findAll(Sort.by("id").descending());for (Student student : id) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("根據id進行排序查找:"+student);}}/*** 查找id在x-y之間的數據* @param id* @param id2*/@GetMapping("/findIdBetween")public void findIdBetween(Integer id, Integer id2){List<Student> byIdBetween = studentRepository.findByidBetween(id, id2);for (Student student : byIdBetween) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("id在x-y之間"+student);}}/*** 查找id在x-y之間的數據并倒序打印* @param id* @param id2*/@GetMapping("/findByIDBetweenOrderByIdDesc")public void findByIDBetweenOrderByIdDesc(Integer id, Integer id2){List<Student> byIDBetweenOrderByIdDesc = studentRepository.findByidBetweenOrderByIdDesc(id, id2);for (Student student : byIDBetweenOrderByIdDesc) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("id在x-y之間,并按id倒序查詢"+student);}}/*** 模糊匹配* @param sname*/@GetMapping("/findBySname")public void findBySname(String sname){List<Student> bySname = studentRepository.findBySname(sname);for (Student student : bySname) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("模糊匹配"+student);}}}

自定義查詢
NativeSearchQueryBuilder:Spring提供的一個查詢條件構建器,幫助構建json格式的請求體

  • matchQuery:詞條匹配,先分詞然后在調用termQuery進行匹配
  • TermQuery:詞條匹配,不分詞
  • wildcardQuery:通配符匹配
  • fuzzyQuery:模糊匹配(允許錯兩個字母)
  • rangeQuery:范圍匹配
  • booleanQuery:布爾查詢
    分頁—排序----高亮
@RestController @RequestMapping("/stu2") public class StudnetController2 {@Resourceprivate StudentRepository studentRepository;/*** 自定義查詢 分詞 matchQuery** @param sname*/@GetMapping("/testSearch")public void testSearch(String sname) {// 創建查詢構建器- 構建條件NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();// 構建條件nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("sname", sname));Page<Student> search = studentRepository.search(nativeSearchQueryBuilder.build());for (Student student : search) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("先分詞,在調用termQuery進行匹配" + student);}}/*** 不分詞匹配 termQuery** @param sname*/@GetMapping("/testQuery")public void testQuery(String sname) {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("sname", sname));Page<Student> search = studentRepository.search(nativeSearchQueryBuilder.build());for (Student student : search) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("詞條匹配,不分詞" + student);}}/*** 分頁查詢** @param page 第n頁* @param size 每頁y條數據* @param sname*/@GetMapping("/testPage")public void testPage(int page, int size, String sname) {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("sname", sname));// 進行分頁nativeSearchQueryBuilder.withPageable(PageRequest.of(page, size));Page<Student> search = studentRepository.search(nativeSearchQueryBuilder.build());for (Student student : search) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("分頁查詢:" + student);}}/*** 排序查詢** @param sname*/@GetMapping("/testOrder")public void testOrder(String sname) {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();nativeSearchQueryBuilder.withQuery(QueryBuilders.termQuery("sname", sname));// 進行排序nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));Page<Student> search = studentRepository.search(nativeSearchQueryBuilder.build());for (Student student : search) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("按照id降序排序查找Sname:" + student);}}/*** 高亮顯示* @param sname*/@GetMapping("/testHighlight")public void testHighlight(String sname) {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();nativeSearchQueryBuilder.withQuery(QueryBuilders.fuzzyQuery("sname", sname));nativeSearchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("sname").// 添加前綴和后綴preTags("<em>").postTags("<em>"));Page<Student> search = studentRepository.search(nativeSearchQueryBuilder.build());for (Student student : search) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("高亮顯示:"+student);}}}

聚合 桶bucket
(1)統計某個字段的數量
ValueCountBuilder vcb = AggregationBuilders.count(“count_uid”).field(“uid”);
(2)去重統計某個字段的數量(有少量誤差)
CardinalityBuilder cb =AggregationBuilders.cardinality(“distinct_count_uid”).field(“uid”);
(3)按日期間隔分組
DateHistogramBuilder dhb = AggregationBuilders.dateHistogram(“dh”).field(“date”);
(4)按某個字段分組
TermsBuilder tb = AggregationBuilders.terms(“group_name”).field(“name”);
(5)求和
SumBuilder sumBuilder = AggregationBuilders.sum(“sum_price”).field(“price”);
(6)求平均
AvgBuilder ab=
AggregationBuilders.avg(“avg_price”).field(“price”);
(7)求最大值
MaxBuilder mb = AggregationBuilders.max(“max_price”).field(“price”);
(8)求最小值
MinBuilder min = AggregationBuilders.min(“min_price”).field(“price”);
(9)聚合過濾
FilterAggregationBuilder fab = AggregationBuilders.filter(“uid_filter”).filter(QueryBuilders.queryStringQuery(“uid:001”));
(10)獲取聚合里面的結果
平均值
TopHitsBuilder thb = AggregationBuilders.topHits(“top_result”);
(11)嵌套的聚合
NestedBuilder nb = AggregationBuilders.nested(“negsted_path”).path(“quests”);
(12)反轉嵌套
AggregationBuilders.reverseNested(“res_negsted”).path(“kps”);

在這里插入代碼片 /*** 聚合 分組*/@GetMapping("/testBucket")public void testBucket() {NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();// 添加分組,分組名稱brands,根據id分組nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("brands").field("id"));// 查詢.放到聚合分組AggregatedPage<Student> search = (AggregatedPage<Student>) studentRepository.search(nativeSearchQueryBuilder.build());// 根據鍵取出數據StringTerms stringTerms = (StringTerms) search.getAggregation("brands");List<StringTerms.Bucket> buckets = stringTerms.getBuckets();for (StringTerms.Bucket bucket : buckets) {EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("分組后名稱:"+bucket.getKeyAsString());EsearchConsont.ElASTICSEARCH_LOG_CONSONT.info("分組后數量:"+bucket.getDocCount());}}

總結

以上是生活随笔為你收集整理的SpringBoot整合Spring Data Elasticsearch的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。