ElasticSearch 文章检索系统。输入关键字可检索文章标题和内容。

创建索引库和类型

PUT /articles
{
  "mappings": {
    "article":{
      "properties": {
        "id":{
          "type": "keyword"
        },
        "title":{
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "author":{
          "type": "keyword"
        },
        "content":{
          "type": "text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}
//查所有
GET articles/article/_search
{
  "query": {"match_all": {}}
}
创建TransportClient 交由工厂管理
@Configuration
public class TranClient {
    @Bean
    public TransportClient getTransportClient(){
        try {
            TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.94.244"),9300));
            return transportClient;
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return null;
        }

    }
}

es代码

//添加索引
public void save(Article article) {
        try {
            XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
            XContentBuilder xContentBuilder1 = xContentBuilder.startObject()
                    .field("id", article.getId())
                    .field("title", article.getTitle())
                    .field("author", article.getAuthor())
                    .field("content", article.getContent()).endObject();
            transportClient.prepareIndex("articles","article").setSource(xContentBuilder1).get();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	//搜索
    public List<Map<String, Object>> select(String userIndex) {
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(false).preTags("<font color='red'>").postTags("</font>").field("*");
        List<Map<String, Object>> list = new ArrayList<>();
        QueryStringQueryBuilder field = QueryBuilders.queryStringQuery(userIndex)
                .field("title")
                .field("author")
                .field("content")
                .analyzer("ik_max_word");
        SearchResponse searchResponse = transportClient.prepareSearch("articles")
                .setTypes("article")
                .setQuery(field)
                //高亮查询
                .highlighter(highlightBuilder)
                .get();
        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
//            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//            list.add(sourceAsMap);

//高亮查询书写语句
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();

            for (String key : highlightFields.keySet()) {
                sourceAsMap.put(key, highlightFields.get(key).getFragments()[0].toString());
            }
            list.add(sourceAsMap);
        }
        return list;
    }
	//删除索引
    public void del(){
    	//根据id删除单个
        //transportClient.prepareDelete("article","articles","id").get();
   //删除所有     transportClient.admin().indices().prepareDelete("articles").execute().actionGet();
    }
service代码
//添加
@Override
    public void save(Article article) {
        article.setId(UUID.randomUUID().toString());
        articleRepository.save(article);
        articleDao.insert(article);
    }

	//定时删除索引库,从数据库中查所有建立索引
    @Override
    public void saveAll() {
        //创建一个定时器
        Timer timer = new Timer();
        //schedule方法是执行时间定时任务的方法
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                articleRepository.del();
                List<Article> select = articleDao.select();
                for (Article article : select) {
                    articleRepository.save(article);
                }
            }
        },1000,60000*2);//延时时间   一个周期时间
    }

	//查
    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<Map<String, Object>> select(String userIndex) {
        List<Map<String, Object>> list = articleRepository.select(userIndex);
        return list;
    }

pom jar包

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.plugin</groupId>
            <artifactId>transport-netty4-client</artifactId>
            <version>6.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.2.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.28</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>


    </dependencies>
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,可以通过检索关键字来查找相关文档。它是基于Java编写的,具有高度可伸缩性和容错能力。 在Elasticsearch中,我们可以通过创建一个索引来存储和组织文档。索引是类似于数据库中的表的概念,它包含多个文档,每个文档又包含多个字段。每个字段都有一个特定的数据类型,如文本、数字或日期。 当需要检索关键字时,我们可以使用查询API来执行搜索操作。查询API提供了多种查询类型,如精确匹配、模糊查询、范围查询等。我们可以指定要搜索的字段和要匹配的关键字Elasticsearch将返回与关键字匹配的文档。 在搜索过程中,Elasticsearch会使用倒排索引来加速搜索速度。倒排索引是一种反向索引的数据结构,它将每个关键字映射到包含该关键字的文档列表。这样,当我们搜索关键字时,Elasticsearch只需要查找包含该关键字的文档,而不是遍历整个文档集合。 除了基本的关键字搜索外,Elasticsearch还提供了更高级的功能。例如,它支持全文搜索,可以将搜索关键字分词后匹配文档中的词项。它还支持聚合操作,可以对搜索结果进行统计、分组和计算等操作。 总的来说,通过使用Elasticsearch检索关键字功能,我们可以快速准确地找到与关键字相关的文档。它在大数据场景下具有很高的性能和灵活性,被广泛应用于各种搜索和分析场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值