精华内容
下载资源
问答
  • ElasticSearch之将网页上爬取的数据elastic search中。 我们一般会将数据保存到elasticsearch中来实现搜索。 项目源码: 源码地址 1.从网页爬取数据 网页解析数据一般会用Jsoup包。首先引进来吧。 接下来,我会...

    ElasticSearch之将网页上爬取的数据传到elasticsearch中。

    我们一般会将数据保存到elasticsearch中来实现搜索。

    项目源码: github地址

    1.从网页爬取数据
    网页解析数据一般会用Jsoup包。首先引进来吧。
    接下来,我会从彼岸图网这个网站爬取一些图片,(仅测试娱乐,无商业用途)并将信息保存到elasticsearch上。
    开始吧。
    新建一个springboot项目。引入jsoup包。以及会用到的json解析包。

      <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.10.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.58</version>
            </dependency>
    

    创建一个类,
    HtmlParseUtil.java:

    在这里插入图片描述
    复制如下代码:

    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.IOException;
    import java.net.URL;
    
    public class HtmlParseUtil {
    
        public static void main(String[] args) throws IOException {
            //你要解析那个网址
            String url = "http://pic.netbian.com/e/search/result/?searchid=16";
            //解析网页返回document对象
            Document document = Jsoup.parse(new URL(url),30000);
    //        Element element = document.getElementById("J_goodsList");
    //        System.out.println(element);
            Elements elements = document.getElementsByClass("slist");
           // System.out.println(elements);
            //获取所有的li元素
            Elements elements1 = elements.first().getElementsByTag("li");
            for (Element el : elements1){
                String img = el.getElementsByTag("img").eq(0).attr("src");
                String name = el.getElementsByTag("b").eq(0).text();
                System.out.println("-------------------------------------------------------------");
                System.out.println(img);
                System.out.println(name);
            }
        }
    
    
    }
    
    

    代码讲解。
    1.你要搜索的网址,后面那个?searchid=16就是你搜索的东西,你可以改成其他的。

     //你要解析那个网址
            String url = "http://pic.netbian.com/e/search/result/?searchid=16";
    

    2.解析网页。
    得到的这个document 对象,就是网页中的dom元素对象,你可以按照js那样操作它。

     //解析网页返回document对象
            Document document = Jsoup.parse(new URL(url),30000);
    

    3.根据id或者class来操作
    注意,这里的slist是怎么来的。你打开彼岸图网,搜索“美女”(搜索的东西自定义),然后f12,
    在这里插入图片描述

    Elements elements = document.getElementsByClass("slist");
    

    注意,保证你的电脑有网。运行测试一下,检查控制台输出的东西。
    在这里插入图片描述

    成功之后,把这个方法封装成一个工具类。以便调用。

    import com.example.boot_es.pojo.Tupian;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    @Component
    public class HtmlParseUtil {
    
        public static void main(String[] args) throws Exception {
       new HtmlParseUtil().parseHtml("12");
        }
    
        public List<Tupian> parseHtml(String keywords) throws Exception {
    
            //你要解析那个网址
            String url = "http://pic.netbian.com/e/search/result/?searchid="+keywords;
            //解析网页返回document对象
            Document document = Jsoup.parse(new URL(url), 30000);
    //        Element element = document.getElementById("J_goodsList");
    //        System.out.println(element);
            Elements elements = document.getElementsByClass("slist");
            // System.out.println(elements);
            //获取所有的li元素
            Elements elements1 = elements.first().getElementsByTag("li");
    
            ArrayList<Tupian> allimage = new ArrayList<>();
    
            for (Element el : elements1) {
    
    
                String img = el.getElementsByTag("img").eq(0).attr("src");
                String name = el.getElementsByTag("b").eq(0).text();
                System.out.println("-------------------------------------------------------------");
                System.out.println(img);
                System.out.println(name);
    
                Tupian tupian = new Tupian();
                tupian.setImg(img);
                tupian.setName(name);
                allimage.add(tupian);
            }
            return  allimage;
            
        }
    }
    
    

    Tupian.java:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Tupian {
        private String img;
        private String name;
    }
    
    

    在这里插入图片描述

    2.保存到ElasticSearch中。

    数据获取成功之后。就要保存到elasticsearch中了。

    首先整合elastic search

    自己添加pom依赖。注意版本,跟你下载的要一致。
    在这里插入图片描述

    在这里插入图片描述

    ElasticSearchClientConfig.java

    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ElasticSearchClientConfig {
    
        @Bean
        public RestHighLevelClient restHighLevelClient(){
            RestHighLevelClient client = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost("127.0.0.1",9200,"http")));
    
            return client;
        }
    
    }
    
    

    TupianService.java

    import com.alibaba.fastjson.JSON;
    import com.example.boot_es.pojo.Tupian;
    import com.example.boot_es.utils.HtmlParseUtil;
    import org.elasticsearch.action.bulk.BulkRequest;
    import org.elasticsearch.action.bulk.BulkResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.RequestOptions;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.common.unit.TimeValue;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.index.query.TermQueryBuilder;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class TupianService {
    
         private final static String  INDEX_NAME ="biantu_index";
        @Autowired
        private RestHighLevelClient restHighLevelClient;
    
        //1解析数据放入到elasticsearch
        public Boolean parseTupian(String keywords) throws Exception {
            List<Tupian> alldata = new HtmlParseUtil().parseHtml(keywords);
    
            BulkRequest bulkRequest = new BulkRequest();
            bulkRequest.timeout("1m");
            for (int i = 0; i < alldata.size(); i++) {
                bulkRequest.add(
                        new IndexRequest("biantu_index")
                                .source(JSON.toJSONString(alldata.get(i)), XContentType.JSON));
            }
            BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    
            return !bulkResponse.hasFailures();
    
        }
    
        //2.获取这写数据实现搜索功能。
    
        public List<Map<String, Object>> searchPage(String keyword, int pageNo, int pageSize) throws IOException {
    
            if (pageNo <= 1) {
                pageNo = 1;
            }
            //条件搜索。
    
            SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    
            //分页
            sourceBuilder.from(pageNo);
            sourceBuilder.size(pageSize);
    
            //精准匹配
            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", keyword);
            sourceBuilder.query(termQueryBuilder);
            sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    
            //执行搜索
            searchRequest.source(sourceBuilder);
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
    
            //结果解析
            ArrayList<Map<String, Object>> list = new ArrayList<>();
            for (SearchHit documentFields : searchResponse.getHits().getHits()) {
                list.add(documentFields.getSourceAsMap());
            }
            return list;
        }
    }
    

    TupianController.java

    
    import com.example.boot_es.pojo.Tupian;
    import com.example.boot_es.service.TupianService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    
    @RestController
    public class TupianController {
    
    
        @Autowired
        private TupianService tupianService;
    
        @GetMapping("/parse/{keyword}")
        public Boolean parse(@PathVariable("keyword") String keyword) throws Exception{
             return tupianService.parseTupian(keyword);
    
        }
    
        @GetMapping("/search/{keyword}/{pageNo}/{pageSize}")
       public List<Map<String,Object>> search(
              @PathVariable("keyword") String keyword,
              @PathVariable("pageNo") int pageNo,
              @PathVariable("pageSize") int pageSize
    
        ) throws IOException {
    
     return tupianService.searchPage(keyword,pageNo,pageSize);
    
       }
    
    

    这里写了两个方法,一个方法是把解析出来的数据放入到elasticsearch中;第二个方法是通过关键字来搜索elasticsearch中的数据并渲染到网页上。

    3.测试

    1.先来测试第一个,把数据放入到elastic search中。

    浏览器输入: http://localhost:8080/parse/14
    在这里插入图片描述

    如果返回的是 true,则表示保存成功。

    返回elasticsearch查看结果:成功插入进来!

    在这里插入图片描述

    接下来测试第二个方法。
    通过关键字搜索,输入网址:localhost:8080/search/4k/1/10 。 表示的意思是。查询name中包含4k的数据,并且显示前10条。成功!

    在这里插入图片描述

    接下来就可以通过Vue来绑定这些数据渲染到网页上了。

    下一篇博客地址: 将数据渲染到网页上

    展开全文
  • I have a mysql database with couple tables, I wanna migrate the mysql data to ElasticSearch. It's easy to migrate the whole database to ES via a batch job. But how should I update ES from mysql realti...

    I have a mysql database with couple tables, I wanna migrate the mysql data to ElasticSearch. It's easy to migrate the whole database to ES via a batch job. But how should I update ES from mysql realtime. i.e if there was a update operation in mysql then I should do the same operation in ES.

    I researched mysql binLog which can reflect any changes from mysql. But I have to parse binLog to ES syntax, I think it's really painful. Thanks!

    (the same case with Solr)

    解决方案

    There is an existing project which takes your binlog, transforms it and ships it to Elasticsearch, You can check it out at: https://github.com/siddontang/go-mysql-elasticsearch

    Note, however, that whichever you pick, it's a good practice to pre-create your index and mappings before indexing your binlog. That gives you more control over your data.

    展开全文
  • ElasticSearch 的客户端官方推荐使用 elasticsearch-rest-high-level-client。所以本文也是基于 elasticsearch-rest-high-level-client 来构建代码。 首先来回顾下单条数据更新是怎么做的,代码如下: ...

    单条更新

    ElasticSearch 的客户端官方推荐使用 elasticsearch-rest-high-level-client。所以本文也是基于 elasticsearch-rest-high-level-client 来构建代码。

    首先来回顾下单条数据的更新是怎么做的,代码如下:

    UpdateRequest updateRequest = new UpdateRequest(index, type, id);
    updateRequest.doc(documentJson, XContentType.JSON);
    restHighLevelClient.update(updateRequest, options);

    hql语句

    POST http://47.105.66.210:9200/article_v1/doc/_update_by_query
    {
        "script": {
            "source":"ctx._source['status']=0;"
        },
        "query": {
            "term": {
                "userId": 1
            }
        } 
    }

    按条件更新需要使用_update_by_query 来进行,query 用于指定更新数据的匹配条件,script 用于更新的逻辑。

    详细使用文档:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html

    https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-using.html

    在 Java 代码中如何实现条件更新呢?

    UpdateByQueryRequest request = new UpdateByQueryRequest("article_v1");
    request.setQuery(new TermQueryBuilder("userId", 1));
    request.setScript(new Script("ctx._source['status']=0;"));
    restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);

    是不是也很简单,跟单条数据更新差不多,使用 UpdateByQueryRequest 构建更新对象,然后设置 Query 和 Script 就可以了。

    条件更新数组

    比如我们的需求是要移除 tags 中的 java,如下:

    POST http://47.105.66.210:9200/article_v1/doc/_update_by_query
    {
        "script": {
            "source":"ctx._source['tags'].removeIf(item -> item == 'java');"
        },
        "query": {
            "term": {
                "userId": 1
            }
        } 
    }

    新增的话只需要将 removeIf 改成 add 就可以了。

    ctx._source['tags'].add('java');

    如果有特殊的业务逻辑,Script 中还可以写判断来判断是否需要修改。

    POST http://47.105.66.210:9200/article_v1/doc/_update_by_query
    {
        "script": {
            "source":"if(ctx._source.type == 11) {ctx._source['tags'].add('java');}"
        },
        "query": {
            "term": {
                "userId": 1
            }
        } 
    }

    封装通用的条件更新

    大部分场景下的更新都比较简单,根据某个字段去更新某个值,或者去更新多个值。在 Java 中如果每个地方都去写脚本,就重复了,最好是抽一个比较通用的方法来更新。

    下面是简单的示列,其中还有很多需要考虑的点,像数据类型我只处理了数字,字符串,和 List,其他的大家需要自己去扩展。

    public BulkByScrollResponse updateByQuery(String index, QueryBuilder query, Map<String, Object> document) {
        UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(index);
        updateByQueryRequest.setQuery(query);
        StringBuilder script = new StringBuilder();
        Set<String> keys = document.keySet();
        for (String key : keys) {
            String appendValue = "";
            Object value = document.get(key);
            if (value instanceof Number) {
                appendValue = value.toString();
            } else if (value instanceof String) {
                appendValue = "'" + value.toString() + "'";
            } else if (value instanceof List){
                appendValue = JsonUtils.toJson(value);
            } else {
                appendValue = value.toString();
            }
            script.append("ctx._source.").append(key).append("=").append(appendValue).append(";");
        }
        updateByQueryRequest.setScript(new Script(script.toString()));
        return updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
    }
    public BulkByScrollResponse updateByQuery(UpdateByQueryRequest updateByQueryRequest, RequestOptions options) {
        Map<String, Object> catData = new HashMap<>(1);
        catData.put(ElasticSearchConstant.UPDATE_BY_QUERY_REQUEST, updateByQueryRequest.toString());
        return CatTransactionManager.newTransaction(() -> {
            try {
                return restHighLevelClient.updateByQuery(updateByQueryRequest, options);
            }catch (IOException e) {
                throw new RuntimeException(e);
            }
        }, ElasticSearchConstant.ES_CAT_TYPE, ElasticSearchConstant.UPDATE, catData);
    }

    如果有了这么一个方法,那么使用方式如下:

    @Test
    public void testUpdate5() {
        Map<String, Object> document = new HashMap<>();
        document.put("title", "Java");
        document.put("status", 0);
        document.put("tags", Lists.newArrayList("JS", "CSS"));
        kittyRestHighLevelClient.updateByQuery(elasticSearchIndexConfig.getArticleSaveIndexName(), new TermQueryBuilder("userId", 1), document);
    }

     

    展开全文
  • client.update_by_query(index="log_index",doc_type='log_index',body=updateBody) 提醒:批量更新可以针对id进行更新 注意:painless 是es专门为更新设置的语言 以上这篇python3实现elasticsearch批量更新数据就是...

    废话不多说,直接上代码!

    updateBody = {

    "query":{

    "range":{

    "write_date": {

    "gte": "2019-01-15 12:30:17",

    "lte": "now"

    }

    }

    },

    "script": {

    "inline": "ctx._source.index = params.index",

    "params": {

    "index": 211

    },

    "lang":"painless"

    }

    }

    es_client.update_by_query(index="log_index",doc_type='log_index',body=updateBody)

    提醒:批量更新可以针对id进行更新

    注意:painless 是es专门为更新设置的语言

    以上这篇python3实现elasticsearch批量更新数据就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持IIS7站长之家。

    展开全文
  • 有的时候我们在使用ES时,由于资源有限或业务需求,我们只想保存最近一段时间的数据。可以通过定时执行以下脚本删除数据:#!/bin/sh# example: sh delete_es_by_day.sh logstash-kettle-log logsdate 30index_name=$...
  • ElasticSearch的River机制ElasticSearch自身提供了一个River机制,用于同步数据。这里能够找到官方眼下推荐的River:可是官方没有提供HBase的River。事实上ES的River很easy,就是一个用户打包好的jar包,ES负责找到...
  • 4. 安装JDK8、MySQL5.6驱动以及...如下图: 安装Logstash input、output插件,此案例数据输入是MySQL,输出是ES,so相应的插件应该是logstash-input-jdbc和logstash-output-elasticsearch。安装插件的命令分别是(...
  • java整合ElasticSearch导入数据到es

    千次阅读 2021-03-05 14:36:55
    实体类:利用注解建立实体类会自动根据实体类创建索引,不需要自己建立mappingpackage com.msic.mall.search.domain;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import ...
  • 今天总结一下通过 Python 更新 Elasticsearch 数据的几个方法Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。...
  • 立即请求查询文档列表,发现刚刚新增的文档查不出来,需要等一会后再次请求查询才能查询出来,随后测试了删除文档列表和更新文档列表中的文档这两个接口,出现了同样的问题,即elasticsearch数据更新有延迟。...
  • 1 新增索引 ...第二步,在第二行文本框中输入test/xudongmaster,第三行输入以下json数据。test为索引名称,xudongmaster为类型名称。 { "name":"xudongmaster", "password":"123456" } 3 查询数据 ...
  • 使用_update 进行部分字段更新操作 //更新操作 POST index/_update/id { "doc": { "field":"data" } } //示列 POST books/_update/001 { "doc": { "title":"三只松鼠" } }
  • 数据样例: {"name":"jack","phone":...需要把phone为0的数据修改为,phone为1,可以使用kibana语句进行更新: POST people/updata_by_query { "script": { "source": "ctx._source['phone']='null'" }, "query":{
  • Elasticsearch 使用updateByQuery批量更新数据 对于批量更新数据,通常我们有2种做法 按照更新的条件,从es查询出所有待更新的记录的id,然后根据id再通过Bulk.Builder接口完成批量更新 直接使用updateByQuery...
  • 在业务系统中做业务保存或是更新操作时,同时向es中做保存或更新。优点:实时性好缺点:耦合性强,对业务系统性能有影响 方案3 方案:异步双写;在业务系统中利用MQ将数据发送队列,另起一个消费系统专门用来...
  • 在工作中,需要把mysql中的数据写入到es中进行分析;官方文档:https://www.elastic.co/guide/en/logstash/6.3/plugins-inputs-jdbc.html下面是配置方法:input{jdbc{#数据库驱动路径jdbc_driver_library=>"/data...
  • Mysql数据同步到Elasticsearch

    千次阅读 多人点赞 2021-11-20 21:11:05
    要通过elasticsearch实现数据检索,首先要将mysql中的数据导入elasticsearch,并实现数据源与elasticsearch数据同步,这里使用的数据源是Mysql数据库,目前mysql与elasticsearch常用的同步机制大多是基于插件实现的...
  • 文章目录前言一、首先有个接收数据库的实体类二、Dao层三、Mapper四、application.yml 连接数据库的相关配置五、用脚本创建下 索引库(注意:这里的Object 只支持对象与Map)六、从Mysql批量导入elasticSearch总结 ...
  • 在请求里加这个参数 request.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); 例如: public boolean saveOrUpdate(String indexName, EsEntity entity, boolean ... } 进行增删改会及时更新es数据
  • 使用相对低配的大磁盘机器配置为 ES 的 Warm Nodes,可以通过 index.routing.allocation.require.box_type 来设置索引是冷数据或者热数据。如果索引极少使用,可以 close 索引,然后在需要搜索的时候 open 即可。 ....
  • canal是阿里巴巴开源的mysql数据传输组件,基于mysql binlog,提供了准确、实时的数据传输服务。有关binlog介绍,参见binlog介绍。 以下来自官方GitHub介绍。GitHub地址 canal [kə’næl],译意为水道/管道/沟渠,...
  • python 查询es数据

    2021-02-04 04:03:13
    /usr/bin/python env#-*- coding: utf-8 -*-#Author:cc#date: 2020/1/9importdatetimeimporttimefrom elasticsearch importElasticsearchimportloggingimportsysfrom collections importCounterimportpymysqllogge.....
  • Docker(同步mysql数据到elasticsearch)一、版本环境二、docker安装mysql,并配置binlog2.1 安装mysql2.2 修改mysql配置2.3 验证mysql binlog配置2.4 查看日志文件三、docker安装elasticsearch,并建立索引3.1 安装...
  • 对于es更新操作,也是有一定的场景需要更新es中的数据,但并不是可以随意更改,毕竟es的优势是海量数据的查询。 多的不说直接看如何操作,首先我们来看下,Es提供的api接口是如何做到修改的? ES API中给我们提供...
  • 最近一直在研究怎么对es 数据库进行追加更新,因为无论是整个文档更新还是局部的更新,都是先找到旧的,然后标记删除,然后再添加新的文档,显然这不能满足需要对文档追加更新的需求,即不覆盖之前的记录进行更新。...
  • 前面的基础,首先,明确一个概念,es...注意:es执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,但是你也无法访问,ES会在你继续添加更多数据的时候在后台清理已经标...
  • 本文主要讲解ElasticSearch数据更新并发与条件式更新,帮助大家打好ElasticSearch基础。 ——continue
  • mysql数据实时同步到Elasticsearch

    千次阅读 2021-01-19 04:34:36
    业务需要把mysql的数据实时同步到ES,实现低延迟的检索到ES中的数据或者进行其它数据分析处理。本文给出以同步mysql binlog的方式实时同步数据到ES的思路, 实践并验证该方式的可行性,以供参考。mysql binlog日志...
  • es 数据 导出 MySQL

    2021-01-19 07:53:53
    暂时没有找到直接 导出 mysql 数据库的工具 或者项目目前实现思路: 使用 elasticdump 工具 实现 从 es 数据 导出 json 文件 ,然后 使用 脚本程序 操作 改 json 文件 实现 导入MySQL 数据具体内容如下:...
  • Elasticsearch 连接器允许将数据写入 Elasticsearch 引擎的索引中。 连接器可以工作在 upsert\ 模式下,使用 DDL 中定义的主键与外部系统交换 UPDATE/DELETE\ 消息。 如果 DDL 中没有定义主键,则连接器只能工作在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 331,657
精华内容 132,662
关键字:

数据更新到es