elasticsearch - 如何将内容和页面描述存储到 ElasticSearch

标签 elasticsearch web-crawler stormcrawler

我能够获取页面 url 并将其存储到 elasticsearch,但我有一个要求,我必须存储页面标题、说明和内容也 ES。我相信这是可能的,但需要更清楚
IndexerBolt.java 和 ES_IndexInit.sh 上的 iication,因为我能够在 indexerBolt 中打印页面内容,但无法将内容映射到正确的字段以更新到 ES。我看到帖子
Can i store html content of webpage in storm crawler?与相同但无法理解它是如何工作的。有人可以给我一个例子或 sudo 我们如何做到这一点。

我在下面尝试过,但没有运气。
ES_IndexInit.sh

curl $ESCREDENTIALS -s -XPUT $ESHOST/status -H 'Content-Type: application/json' -d '
{
    "settings": {
        "index": {
            "number_of_shards": 10,
            "number_of_replicas": 1,
            "refresh_interval": "5s"
        }
    },
    "mappings": {
        "status": {
            "dynamic_templates": [{
                "metadata": {
                    "path_match": "metadata.*",
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "keyword"
                    }
                }
            }],
            "_source": {
                "enabled": true
            },
            "properties": {
                "nextFetchDate": {
                    "type": "date",
                    "format": "dateOptionalTime"
                },
                "status": {
                    "type": "keyword"
                },
                "url": {
                    "type": "keyword"
                },
                **"content": {
                    "type": "keyword"
                }**
            }
        }
    }
}'

IndexerBolt.java
public void execute(Tuple tuple) {

        String url = tuple.getStringByField("url");

        // Distinguish the value used for indexing
        // from the one used for the status
        String normalisedurl = valueForURL(tuple);
 System.out.println("************************header::***********"+tuple.toString());
            System.out.println("************************content ::***********"+tuple.getStringByField("text"));
        Metadata metadata = (Metadata) tuple.getValueByField("metadata");
        String text = tuple.getStringByField("text");
        **String content = tuple.getStringByField("text");**
        boolean keep = filterDocument(metadata);
        if (!keep) {
            eventCounter.scope("Filtered").incrBy(1);
            // treat it as successfully processed even if
            // we do not index it
            _collector.emit(StatusStreamName, tuple, new Values(url, metadata,
                    Status.FETCHED));

            **_collector.emit(StatusStreamName, tuple, new Values(content, metadata,
                    Status.FETCHED));**

            _collector.ack(tuple);
            return;
        }

--
非常感谢您提前。
问候,
马达瓦

最佳答案

此 IndexerBolt 不会将文档索引到 Elasticsearch,它用于调试并将内容发送到控制台。 The one you want在 ES 模块中。

您复制的部分模式处理 状态 的 URL,而不是它们的内容。顺便说一句,您绝对不想将内容字段索引为关键字。

您需要更改内容索引的映射 add store true to the content field , 另见 ES documentation .

video tutorial SC 1.5 有点过时,但应该可以帮助您了解基础知识。

关于elasticsearch - 如何将内容和页面描述存储到 ElasticSearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58913911/

相关文章:

elasticsearch - 如何在Elasticsearch中将某些单词组合成 token ?

elasticsearch - filebeat 如何检查文件中的新内容?

elasticsearch - 如何处理批量请求中的错误

javascript - 建立地理定位照片索引——爬网还是依赖现有的 API?

web-crawler - 从 scrapinghub 中删除蜘蛛

java - 使用 Tika 进行递归爬网的 Storm Crawler 配置

elasticsearch - Elasticsearch未突出显示所有匹配项

javascript - 仅获取维基百科摘要

java - 关闭 SSL 证书验证

elasticsearch - 如何根据主机将StormCrawler内容发送到多个Elasticsearch索引?