为 Stormcrawler 配置 Deletion Bolt 的正确方法
Proper way to configure Deletion Bolt for Stormcrawler
因此,我尝试在我的风暴爬虫实例上打开 Deletion Bolt,以便它们可以在我们网站的 URL 更改和页面消失时清理索引。
作为参考,我在 1.13。 (我们的系统人员还没有将我们升级到 Elk v7)
从未尝试修改 es-crawler.flux,我正在寻求一些帮助,让我知道我是否正确地这样做。
我添加了一个螺栓:
- id: "deleter"
className: "com.digitalpebble.stormcrawler.elasticsearch.bolt.DeletionBolt"
parallelism: 1
然后添加流:
- from: "status"
to: "deleter"
grouping:
type: FIELDS
args: ["url"]
streamId: "deletion"
这是执行此操作的正确方法吗?我不想因输入错误信息而意外删除索引中的所有内容。
是的,回答我自己的问题,将以上两项添加到 es-crawler.flux 中各自的位置确实会导致爬虫删除文档。
为了对此进行测试,我在我们的一台服务器上创建了一个目录,其中包含一些文件 - index.html、test1.html、test2.html 和 test3.html. index.html 对三个测试 html 文件有 links。我用爬虫抓取它们,首先将其限制为仅抓取该特定目录。我还修改了抓取设置以在 3 分钟后重新抓取已抓取的文档,并在 5 分钟后重新抓取抓取错误的文档。
所有 4 个文档在状态索引中显示为 FETCHED
,内容在内容索引中。
然后我将 test3.html 重命名为 test5.html,并更改了 index.html 中的 link。爬虫获取了变化,并将 test3.html 的状态更改为 FETCH_ERROR
并将 test4.html 添加到索引中。
5 分钟后它再次抓取它,保持抓取错误状态。
又过了 5 分钟,它再次抓取它,将状态更改为 ERROR
并从内容索引中删除 test3.html 文档。
所以效果很好。在我们的生产索引中,我们有一堆文档从 FETCH_ERROR
状态变为 ERROR
状态,但由于未启用删除,实际内容未被删除并且仍在搜索中显示。在我的测试页面上,这是解决方案:
我禁用了删除(从es-crawler.flux中删除了以上两项)并将test2.html重命名为test5.html,修改了[=47中的link =].爬虫以 FETCH_ERROR
完成了三个爬虫并将其设置为 ERROR
状态但没有从内容索引中删除该文档。
我重新启用删除并让爬虫 运行 了一会儿,但很快意识到当爬虫将状态设置为 ERROR
时,它也将 nextFetchDate
设置为2099 年 12 月 31 日。
所以我进入了 elasticsearch 索引和 运行 以下查询以将状态和日期重置为刚好在当前 date/time 之前的内容:
POST /www-test-status/_update_by_query
{
"script": {
"source": """
if (ctx._source?.status != null)
{
ctx._source.remove('metadata.error%2Ecause');
ctx._source.remove('status');
ctx._source.put('status', 'FETCH_ERROR');
ctx._source.remove('nextFetchDate');
ctx._source.put('nextFetchDate', '2019-10-09T15:01:33.000Z');
}
""",
"lang": "painless"
},
"query": {
"match": {
"status": "ERROR"
}
}
}
爬虫下次出现时会拾取文档,并在返回 ERROR
状态时从内容索引中删除文档。
不确定这是否是完全正确的方法,但它对我有用。
因此,我尝试在我的风暴爬虫实例上打开 Deletion Bolt,以便它们可以在我们网站的 URL 更改和页面消失时清理索引。
作为参考,我在 1.13。 (我们的系统人员还没有将我们升级到 Elk v7)
从未尝试修改 es-crawler.flux,我正在寻求一些帮助,让我知道我是否正确地这样做。
我添加了一个螺栓:
- id: "deleter"
className: "com.digitalpebble.stormcrawler.elasticsearch.bolt.DeletionBolt"
parallelism: 1
然后添加流:
- from: "status"
to: "deleter"
grouping:
type: FIELDS
args: ["url"]
streamId: "deletion"
这是执行此操作的正确方法吗?我不想因输入错误信息而意外删除索引中的所有内容。
是的,回答我自己的问题,将以上两项添加到 es-crawler.flux 中各自的位置确实会导致爬虫删除文档。
为了对此进行测试,我在我们的一台服务器上创建了一个目录,其中包含一些文件 - index.html、test1.html、test2.html 和 test3.html. index.html 对三个测试 html 文件有 links。我用爬虫抓取它们,首先将其限制为仅抓取该特定目录。我还修改了抓取设置以在 3 分钟后重新抓取已抓取的文档,并在 5 分钟后重新抓取抓取错误的文档。
所有 4 个文档在状态索引中显示为 FETCHED
,内容在内容索引中。
然后我将 test3.html 重命名为 test5.html,并更改了 index.html 中的 link。爬虫获取了变化,并将 test3.html 的状态更改为 FETCH_ERROR
并将 test4.html 添加到索引中。
5 分钟后它再次抓取它,保持抓取错误状态。
又过了 5 分钟,它再次抓取它,将状态更改为 ERROR
并从内容索引中删除 test3.html 文档。
所以效果很好。在我们的生产索引中,我们有一堆文档从 FETCH_ERROR
状态变为 ERROR
状态,但由于未启用删除,实际内容未被删除并且仍在搜索中显示。在我的测试页面上,这是解决方案:
我禁用了删除(从es-crawler.flux中删除了以上两项)并将test2.html重命名为test5.html,修改了[=47中的link =].爬虫以 FETCH_ERROR
完成了三个爬虫并将其设置为 ERROR
状态但没有从内容索引中删除该文档。
我重新启用删除并让爬虫 运行 了一会儿,但很快意识到当爬虫将状态设置为 ERROR
时,它也将 nextFetchDate
设置为2099 年 12 月 31 日。
所以我进入了 elasticsearch 索引和 运行 以下查询以将状态和日期重置为刚好在当前 date/time 之前的内容:
POST /www-test-status/_update_by_query
{
"script": {
"source": """
if (ctx._source?.status != null)
{
ctx._source.remove('metadata.error%2Ecause');
ctx._source.remove('status');
ctx._source.put('status', 'FETCH_ERROR');
ctx._source.remove('nextFetchDate');
ctx._source.put('nextFetchDate', '2019-10-09T15:01:33.000Z');
}
""",
"lang": "painless"
},
"query": {
"match": {
"status": "ERROR"
}
}
}
爬虫下次出现时会拾取文档,并在返回 ERROR
状态时从内容索引中删除文档。
不确定这是否是完全正确的方法,但它对我有用。