sách gpt4 ăn đã đi

Triển khai chức năng tìm kiếm Elaticsearch (5)--Thực hành chiến đấu

In lại Tác giả: Tôi là chú chim nhỏ Thời gian cập nhật: 2023-04-19 06:31:12 30 4
mua khóa gpt4 giày nike

Môi trường chiến đấu thực tế.

tìm kiếm đàn hồi 8.5.0 + kibna 8.5.0 + springboot 3.0.2 + spring data elasticsearch 5.0.2 + jdk 17 。

1. Tích hợp dữ liệu spring elasticsearch

1 添加依赖

                        
                           org.springframework.boot spring-boot-starter-data-elasticsearch 

                        
                      

2 Cấu hình kết nối es

                        
                          @Configuration lớp công khai ElasticsearchConfig mở rộng ElasticsearchConfiguration { @Ghi đè lớp công khai ClientConfiguration clientConfiguration() { trả về ClientConfiguration.builder() .connectedTo("127.0.0.1:9200") .withBasicAuth("đàn hồi", "********") .build(); } }

                        
                      

3 Định cấu hình in các câu lệnh DSL

                        
                          # Ghi nhật ký cấu hình ghi nhật ký: cấp độ: #es log org.springframework.data.elasticsearch.client.WIRE: trace

                        
                      

2. Viết file chỉ mục và ánh xạ

                        
                          @Data @Document(indexName = "news") //Tên chỉ mục @Setting(shards = 1,replicas = 0,refreshInterval = "1s") //Số lượng phân đoạn bản sao Số lượng bản sao @Schema(name = "News" , description = "News object") public class News triển khai Serializable { @Id //Khóa chính chỉ mục @NotBlank(message = "News ID không được để trống") @Schema(type = "integer",description = "News ID",example = "1") id Số nguyên riêng tư @NotBlank(message = "Tiêu đề tin tức không được để trống") @Schema(type = "String",description = "Tiêu đề tin tức") @MultiField(mainField = @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart"), otherFields = {@InnerField(type = FieldType.Keyword, suffix = "keyword") }) // Các trường loại hỗn hợp chỉ định dấu tách từ khi xây dựng chỉ mục và dấu tách từ tham số khi tìm kiếm Tiêu đề chuỗi riêng tư @; Schema(type = "LocalDate", description = "Thời gian xuất bản") @Field(type = FieldType.Date, format = DateFormat.date) riêng LocalDate pubDate; @Schema(type = "String",description = "Source") @Field(type = FieldType.Keyword) nguồn chuỗi riêng tư @Schema(type = "String",description = "Mã loại ngành",example = "1, 2,3") @Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_smart") Công nghiệp chuỗi riêng tư; @Schema(type = "Chuỗi",description = "Loại cảnh báo") @Field(type = FieldType.Keyword) riêng Loại chuỗi; @Schema(type = "String",description = "Công ty liên quan") @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") các công ty chuỗi riêng tư @Schema(type = "String", description = "Nội dung tin tức") @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart") Nội dung chuỗi riêng tư }

                        
                      

3. Viết lớp DAO

                        
                          @Repository giao diện công khai NewsRepository mở rộng ElasticsearchRepository { Trang findByType(String type, Pageable pageable); }

                        
                      

4. Thực hiện chức năng đơn giản

4.1 Cách viết hàm đơn giản

                        
                              /** * Thêm tin tức* @param news * @return */ @Override public void saveNews(News news) { newsRepository.save(news); } /** * Xóa tin tức* @param newsId */ @Override public void delete (Integer newsId) { newsRepository.deleteById(newsId); } /** * Xóa chỉ mục tin tức*/ @Override public void deleteIndex() { hoạt động.indexOps(News.class).delete(); } /** * Tạo chỉ mục*/ @Override public void createIndex() { Operations.indexOps(News.class).createWithMapping() } @Override public PageResult findByType( Loại chuỗi) { // Sắp xếp theo ngày xuất bản trước Sắp xếp sắp xếp = Sort.by(new Order(Sort.Direction.DESC, "pubDate")); = PageRequest.of(0,10,sort); Trang cuối cùng newsPage = newsRepository.findByType(type, pageable); trả về PageResult mới(newsPage.getTotalElements(),newsPage.getContent());

                        
                      

Nhận ra hình ảnh hiệu ứng:

Tuyên bố DSL được thực thi thực tế:

Lưu ý: _score sẽ được để trống khi điều kiện sắp xếp được chỉ định.

4.2 Thực hiện chức năng tìm kiếm

                        
                              @Override công khai PageResult searchNews(NewsPageSearch search) { //Tạo đối tượng DSL truy vấn gốc cuối cùng NativeQueryBuilder NativeQueryBuilder = new NativeQueryBuilder(); // Sắp xếp theo ngày xuất bản trước và sau đó theo điểm Sắp xếp = Sort.by(new Order(Sort. Direction.DESC, "pubDate"),Đơn hàng mới(Sort.Direction.DESC, "_score")); PageRequest.of(search.getCurPage(), search.getPageSize(),sort); cuối cùng BoolQuery.Builder boolBuilder = new BoolQuery.Builder(); // Lọc điều kiện setFilter(search, boolBuilder); .isNotBlank(search.getKeyword())){ setKeyWordAndHighlightField(search, localQueryBuilder, boolBuilder); }else { localQueryBuilder.withQuery(q -> q.bool(boolBuilder.build())); } localQueryBuilder.withPageable(pageable); SearchHits searchHits = Operations.search(nativeQueryBuilder.build(), News .class); // Đánh dấu danh sách đóng gói chèn lấp cuối cùng newsList = searchHits.getSearchHits().stream() .map(s -> { nội dung tin tức cuối cùng = s.getContent(); Danh sách cuối cùng title = s.getHighlightFields().get("title"); Danh sách cuối cùng contentList = s.getHighlightFields().get("content"); if (!CollectionUtils.isEmpty(title)){ s.getContent().setTitle(title.get(0)); } if (!CollectionUtils.isEmpty(contentList)){ s.getContent().setContent(contentList.get(0) } trả về nội dung; .collect(Collectors.toList()); trả về PageResult(searchHits.getTotalHits(),newsList mới); Đặt điều kiện lọc Loại ngành Loại cảnh báo nguồn * @param search * @param boolBuilder */ Private void setFilter(NewsPageSearch search, BoolQuery.Builder boolBuilder) { //Loại ngành if(StringUtils.isNotBlank(search.getIndustry())){ / / Chia danh sách theo dấu phẩy IndustryQueries = Arrays.asList(search.getIndustry().split(",")).stream().map(p -> { Query.Builder queryBuilder = new Query.Builder(); queryBuilder.term(t -> t.field ("ngành").value(p)); trả về queryBuilder.build() }).collect(Collectors.toList()); boolBuilder.filter(f -> f.bool(t -> t. Should(industryQueries))); } // Source if(StringUtils.isNotBlank(search.getSource())){ // Tách danh sách sourceQueries = Arrays.asList(search.getSource().split(",")).stream().map(p -> { Query.Builder queryBuilder = new Query.Builder(); queryBuilder.term(t -> t.field("source").value(p)); trả về queryBuilder.build(); boolBuilder.filter(f -> f.bool(t -> t. Should(sourceQueries))); Loại cảnh báo if(StringUtils.isNotBlank(search.getType())){ // Chia danh sách theo dấu phẩy typeQueries = Arrays.asList(search.getType().split(",")).stream map(). (p -> { Query.Builder queryBuilder = new Query.Builder(); queryBuilder.term(t -> t.field("type").value(p)); trả về queryBuilder.build();collect(Collectors.toList()); nên(typeQueries))); } // Khoảng phạm vi if (StringUtils.isNotBlank(search.getStartDate())){ boolBuilder.filter(f -> f.range(r -> r.field("pubDate") .gte(JsonData.of(search.getStartDate())) .lte(JsonData.of(search.getEndDate())))); } } /** * 关键字搜索 title 权重更高 * 高亮字段 title 、content * @param search * @param localQueryBuilder * @param boolBuilder */ Private void setKeyWordAndHighlightField(NewsPageSearch search, NativeQueryBuilder NativeQueryBuilder, BoolQuery.Builder boolBuilder) { cuối cùng Từ khóa chuỗi = search.getKeyword(); //查询条件 boolBuilder.must(b -> b.multiMatch(m -> m.fields("title","content","companies").query(keyword))); // Hiển thị final HighlightFieldParameters.HighlightFieldParametersBuilder builder = HighlightFieldParameters.builder(); builder.withPreTags("") .withPostTags("") .withRequireFieldMatch(true) // Giá trị trả về Tiêu đề .withNumberOfFragments(0); //Tiêu đề chính final HighlightField titleHighlightField = new HighlightField("title", builder.build()); final HighlightField contentHighlightField = new HighlightField("content", builder.build()); final Highlight titleHighlight = new Highlight(Danh sách(titleHighlightField,contentHighlightField)); nativeQueryBuilder.withQuery( f -> f.functionScore( fs -> fs.query(q -> q.bool(boolBuilder.build())) .functions( FunctionScore.of(func -> func.filter( fq -> fq .match(ft -> ft.field("title").query(keyword))).weight(100.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft .field("nội dung").truy vấn(từ khóa))).trọng số(20.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft.field("công ty") .query(từ khóa))).weight(10.0))) .scoreMode(FunctionScoreMode.Sum) .boostMode(FunctionBoostMode.Sum) .minScore(1.0))) .withHighlightQuery(mới HighlightQuery(titleHighlight,Tin tức.lớp)); }bộ lọc( fq -> fq.match(ft -> ft.field("title").query(từ khóa))).trọng số(100.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft.field("content").query(từ khóa))).trọng số(20.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft.field("companies").query(từ khóa))).trọng số(10.0))) .scoreMode(FunctionScoreMode.Sum) .boostMode(FunctionBoostMode.Sum) .minScore(1.0))) .withHighlightQuery(new HighlightQuery(titleHighlight,News.class)); }bộ lọc( fq -> fq.match(ft -> ft.field("title").query(từ khóa))).trọng số(100.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft.field("content").query(từ khóa))).trọng số(20.0)), FunctionScore.of(func -> func.filter( fq -> fq.match(ft -> ft.field("companies").query(từ khóa))).trọng số(10.0))) .scoreMode(FunctionScoreMode.Sum) .boostMode(FunctionBoostMode.Sum) .minScore(1.0))) .withHighlightQuery(new HighlightQuery(titleHighlight,News.class)); }

                        
                      

đạt được hiệu quả

Hiệu ứng trước khi cân:

Hiệu ứng trọng số:

Tuyên bố DSL:

                        
                          { "from": 0, "size": 6, "sort": [{ "pubDate": { "mode": "min", "order": "desc" } }, { "_score": { "order": "desc" } }], "highlight": { "fields": { "title": { "number_of_fragments": 0, "post_tags": [""], "pre_tags": [""] }, "content": { "number_of_fragments": 0, "post_tags": [""], "pre_tags": [""] } } }, "query": { "function_score": { "boost_mode": "sum", "functions": [{ "filter": { "match": { "title": { "truy vấn": "立足优势稳住外贸基本盘" } } }, "weight": 100.0 }, { "filter": { "match": { "content": { "query": "立足优势稳住外贸基本盘" } } }, "weight": 20,0 }, { "filter": { "match": { "companies": { "query": "立足优势稳住外贸基本盘" } } }, "weight": 10,0 }], "min_score": 1,0, "query": { "bool": { "bộ lọc": [{ "bool": { "nên": [{ "term": { "ngành": { "value": "1" } } }, { "term": { "industry": { "value": "2" } } }, { "term": { "ngành": { "value": "3" } } }] } }, { "bool": { "nên": [{ "term": { "source": { "value": "新华社" } } }, { "term": { "source": { "value": "中国经济网" } } }] } }, { "bool": { "nên": [{ "term": { "type": { "value": "经济简报" } } }, { "thuật ngữ": { "loại": { "value": "外贸简报" } } }] } }, { "range": { "pubDate": { "gte": "2023-03-29", "lte": "2023-03-30" } } }], "must": [{ "multi_match": { "fields": ["title", "content", "công ty"], "truy vấn": "立足优势稳住外贸基本盘" } }] } }, "score_mode": "sum" } }, "track_scores": false, "version": true }

                        
                      

4.3 Kiểm tra giao diện

hình ảnh

Cuối cùng, bài viết này về việc triển khai chức năng tìm kiếm Elaticsearch (5) - bài viết thực tế kết thúc tại đây. Nếu bạn muốn biết thêm về việc triển khai chức năng tìm kiếm Elaticsearch (5) - nội dung thực tế, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục Duyệt. các bài viết liên quan, hi vọng các bạn sẽ ủng hộ blog của mình trong tương lai! .

30 4 0
tôi là một con chim nhỏ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress