ElasticSearch:文章检索

这篇具有很好参考价值的文章主要介绍了ElasticSearch:文章检索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现目标

ElasticSearch:文章检索,elasticsearch,大数据,搜索引擎,全文检索

思路与ES前期准备

ElasticSearch:文章检索,elasticsearch,大数据,搜索引擎,全文检索

使用postman添加映射put请求 :

搜索结果展示内容:标题、布局、枫叶图片、发布时间、作者名称、文章id、作者id、静态url 需要对:内容、标题进行分词

json "content":{ "type":"text", "ananlyze":"ik_smart" }

http://${url}:${port}/appinfoarticle

ElasticSearch:文章检索,elasticsearch,大数据,搜索引擎,全文检索

校验尝试:

GET请求查询映射:http://${url}:${port}/appinfoarticle

DELETE请求,删除索引及映射:http://${url}:${port}/appinfoarticle

GET请求,查询所有文档:http://${url}:${port}/appinfoarticle/_search

ElasticSearch:文章检索,elasticsearch,大数据,搜索引擎,全文检索

查询所有文章,批量导入到es库中

```java BulkRequest bulkRequest = new BulkRequest("appinfoarticle");

for (SearchArticleVo searchArticleVo : searchArticleVos) {

IndexRequest indexRequest = new IndexRequest().id(searchArticleVo.getId().toString())
        .source(JSON.toJSONString(searchArticleVo), XContentType.JSON);

//批量添加数据
bulkRequest.add(indexRequest);

} restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);

``` 其中: bulkRequest用法

```java RestHighLevelClient restHighLevelClient = new RestHighLevelClient();//创建一个es客户端,用于执行请求

BulkRequest bulkRequest = new BulkRequest(); //创建一个批量请求

IndexRequest indexRequest1 = new IndexRequest("indexname"); //创建第一个“添加文档”的请求 indexRequest1.id("1") .source(XContentType.JSON,"fieldname", "foo1");//设置添加的文档信息 IndexRequest indexRequest2 = new IndexRequest("indexname"); //创建第二个“添加文档”的请求 indexRequest2.id("1") .source(XContentType.JSON,"fieldname", "foo2");//设置添加的文档信息

bulkRequest.add(indexRequest1); //将第一个“添加文档”请求加入到批量请求中 bulkRequest.add(indexRequest2); //将第二个“添加文档”请求加入到批量请求中

BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);//执行批量请求,返回执行结果

```

查询时各种条件的构造的正确姿势

由于es在java中查询没法像mybatis那样方便,而且es的构造器使用也比较繁琐,理解不是很方便,所以下面来记录es构造器BoolQueryBuilder查询时各种条件的构造的正确姿势。

1.构造准备

java //1.构建SearchRequest请求对象,指定索引库 SearchRequest searchRequest = new SearchRequest("data_info"); //2.构建SearchSourceBuilder查询对象 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //2.1 这个条件用于返回所有命中条件的数据数量, 不设置则返回大概数值 sourceBuilder.trackTotalHits(true); //3.检索条件构造 BoolQueryBuilder bqb = QueryBuilders.boolQuery();

2.条件构造:must可以使用filter代替,效率更高,因为must会对_score评估

```java //3.1 完全匹配 bqb.must(QueryBuilders.matchQuery("code", 666L);

//3.2 模糊匹配 bqb.must(QueryBuilders.matchPhraseQuery("name", "张");

//3.3 in的效果 传单个参数就是完全匹配 bqb.must(QueryBuilders.termsQuery("code", new Long[]{1L, 2L, 3L}); bqb.must(QueryBuilders.termsQuery("code", 1L, 2L, 3L);

//3.4 or条件 BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery(); shouldQuery.should(QueryBuilders.matchQuery("code", 1L); shouldQuery.should(QueryBuilders.matchQuery("code", 2L); shouldQuery.minimumShouldMatch(1); //至少满足一个 bqb.must(shouldQuery);

//3.5 非null bqb.must(QueryBuilders.existsQuery("iden")); //是null
bqb.mustNot(QueryBuilders.existsQuery("iden"));

//3.6 大于等于gte (gt-大于 lt-小于 lte-小于等于) bqb.must(QueryBuilders.rangeQuery("time").gte(new Date());

//3.7 中文完全匹配 bqb.must(queryBuilder.matchPhraseQuery("key", value));

//3.8 匹配多个字段 bqb.must(queryBuilder.multiMatchQuery(value, key1, key2, key3)); ```

3.构造完成 准备查询

```java //4.将QuseryBuilder对象设置到SearchSourceBuilder对象中 sourceBuilder.query(bqb); //5.排序 sourceBuilder.sort("updateTime", SortOrder.DESC); //6.分页 sourceBuilder.from((dto.getPageNum() - 1) * dto.getPageSize()); sourceBuilder.size(dto.getPageSize());

//设置高亮 title HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); highlightBuilder.preTags(""); highlightBuilder.postTags("");

searchBuilder.highlighter(highlightBuilder);

//7.将SearchSourceBuilder设置到SearchRequest中 searchRequest.source(sourceBuilder);

//8.调用方法查询数据 SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

//9.解析返回结果 SearchHit[] hits = searchResponse.getHits().getHits(); for (int i = 0; i < hits.length; i++) { System.out.println("返回的结果: " + hits[i].getSourceAsString()); }

log.info("返回总数为:" + searchResponse.getHits().getTotalHits()); int total = (int)searchResponse.getHits().getTotalHits().value; ```

检索业务实现

  1. 配置config ```java @Getter @Setter @Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticSearchConfig { private String host; private int port;

    @Bean public RestHighLevelClient client(){ System.out.println(host); System.out.println(port); return new RestHighLevelClient(RestClient.builder( new HttpHost( host, port, "http" ) )); } } ```

  2. 构造一个UserSearchDto其中包含字段 搜索关键字searchWords、当前页pageNum、分页条数pageSize、最小时间minBehotTime。其中提供一个分页算法

java public int getFromIndex(){ if(this.pageNum<1)return 0; if(this.pageSize<1) this.pageSize = 10; return this.pageSize * (pageNum-1); } 2. 进行编写es代码

```java // 传入参数为UserSearchDto // 1 设置查询条件 SearchRequest searchRequest = new SearchRequest("key_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

// 2 设置查询条件 BoolQueryBuilder boolQueryBuilder = QueryBuilders.query();

// 关键字的分词后查询 QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery(dto.getSearchWords()).field("title").field("content").defaultOperatior(Operator.OR); boolQueryBuilder.must(queryStringQueryBuilder);

// 查询小于minBehotTim的数据 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime").lt(dto.getMinHotTime().getTime()); boolQueryBuilder.filter(rangeQueryBuilder);

// 分页查询 searchSourceBuilder.from(0); searchSourceBuilder.size(dto.getPageSize());

// 按照发布时间倒序查询 searchSourceBuilder.sort("publishTime", SortOrder.DESC);

// 设置高亮 title HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("title"); highlightBuilder.preTags(""); highlightBuilder.postTags("") searchSourceSearch.highlighter(highlightBuilder);

// 执行查询 searchSourceBuilder.query(boolQueryBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = restHighLevelClient.search(searchRequet, RequestOptions.DEFAULT); ```

文章审核后构建索引

收集数据并发送消息

```java //发送消息,创建索引 createArticleESIndex(apArticle,content,path);

@Autowired private KafkaTemplate kafkaTemplate;

/** * 送消息,创建索引 * @param apArticle * @param content * @param path */ private void createArticleESIndex(ApArticle apArticle, String content, String path) { SearchArticleVo vo = new SearchArticleVo(); BeanUtils.copyProperties(apArticle,vo); vo.setContent(content); vo.setStaticUrl(path);

kafkaTemplate.send(ArticleConstants.ARTICLE_ES_SYNC_TOPIC, JSON.toJSONString(vo));

}

public static final String ARTICLEESSYNC_TOPIC = "article.es.sync.topic"; ```

搜索的微服务 接收消息并创建场景

  1. 搜索微服务中添加kafka的配置,nacos配置

yaml spring: kafka: bootstrap-servers: ${url}:${port} consumer: group-id: ${spring.application.name} key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer 2. 定义监听接收消息,保存索引数据,class SyncArticleListener

```java @AutoWired private RestHighLevelClient restHighLevelClient;

@KafkaListener(topics = ArticleConstants.ARTICLEESSYNC_TOPIC) public void onMessage(String message){ if(StringUtils.isNotBlank(message)){ log.info("SyncArticleListener message = {}", message); SearchArticleVo searchArticleVo = JSON.parseObject } } ```文章来源地址https://www.toymoban.com/news/detail-732130.html

到了这里,关于ElasticSearch:文章检索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lucene和Solr和Elasticsearch区别,全文检索引擎工具包Lucene索引流程和搜索流程实操

    我们生活中的数据总体分为两种: 结构化数据和非结构化数据 。 结构化数据 :指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据 :指不定长或无固定格式的数据,如 互联网数据、邮件,word文档等。 非结构化数据又有一种叫法叫全文数据 按照数据的

    2024年02月03日
    浏览(42)
  • ElasticSearch搜索引擎:数据的写入流程

    (1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node  (2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片 shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上 shard = hash(document_id) %

    2023年04月14日
    浏览(63)
  • Elasticsearch(二)kibana数据检索

    有了数据学习使用kibana调用api检索数据,熟练kibana操作后再进一步使用spring data。 term 用于keyword类型数据 精准查询 ,类似mysql match 用于text类型数据 分词查询 ,倒排索引 首先针对keyword文本类型查询学习,类似于Mysql对字段的查询。 文档内容格式参考 结构化搜索 是指对结构

    2024年02月03日
    浏览(43)
  • Java操作Elasticsearch进行数据检索

    1.安装依赖 (注意版本要和自己安装的es版本对应)          打开发现部分依赖和我们es版本不一致,是因为springboot指定了版本,我们需要更换为自己对应版本。 1.1、改为自己es对应版本  2.编写配置类 3.配置类添加请求选项 4、测试 4.1、存储数据到es  4.2、检索数据  

    2024年02月16日
    浏览(42)
  • 基于Elasticsearch与Hbase组合框架的大数据搜索引擎

    本项目为学校大数据工程实训项目,共开发4周,答辩成绩不错。代码仓库放文章尾,写的不好,代码仅供参考。 对于结构化数据 ,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的二维表(Table)的方式存储和搜索,也可以建立索引。

    2024年02月09日
    浏览(63)
  • elasticsearch 百亿级数据检索案例与原理

    版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处( elasticsearch 百亿级数据检索案例与原理 - mikevictor - 博客园 ),以下内容为个人理解,仅供参考。 一、前言      数据平台已迭代三个版本,从头开始遇到很多常见的难题,终于有片段时间整理一些已完

    2024年02月14日
    浏览(35)
  • Elasticsearch (ES) 搜索引擎: 数据类型、动态映射、多类型(子字段)

    原文链接:https://xiets.blog.csdn.net/article/details/132348634 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 映射字段的 数据类型 ,官网文档参考:Field data types。 下面是 ES 常用的一些基本数据类型。 字符串 类型: keyword :类型。 text :文本类型。

    2024年03月23日
    浏览(63)
  • Langchain 与 Elasticsearch:创新数据检索的融合实战

    在信息爆炸的时代,有效地检索和处理数据变得至关重要。Langchain 和 Elasticsearch 的结合,为我们提供了一个强大的工具,以更智能的方式进行数据检索和分析。 作为一名拥有多年 Elasticsearch 实战经验的技术博主,我将在本文中详细介绍这两种技术的整合应用。 Langchain是一个

    2024年01月19日
    浏览(41)
  • elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近

    2024年02月08日
    浏览(47)
  • 微服务04 分布式搜索引擎 elasticsearch DSL数据聚合 自动补全 数据同步 集群 Sentinel

    聚合(aggregations)可以让我们极其 方便的实现对数据的统计、分析、运算 。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些 统计功能的比数据库的sql要方便的多,而且查询速度非常快 ,可以实现近

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包