mongodb - Scrapy MongoDB和Elasticsearch同步

标签 mongodb elasticsearch scrapy

我正在使用Scrapy从网站和mongodb获取数据以实现持久性,并使用Elasticsearch进行搜索。
我的问题是,当Scrapy将数据插入Mongodb时,即使将侦听器设置为插入,更新和删除,Elasticsearch也不知道。
我是否应该为Scrapy添加一个新插件以直接与Elasticsearch通信,如果是,为什么监听器不监听数据库发生了什么?谢谢!

最佳答案

elasticsearch中的河流已弃用。
试试这个,您可以使用transporter在mongodb和elasticsearch之间同步数据。
How To Sync Transformed Data from MongoDB to Elasticsearch with Transporter
安装Go
为了安装compose传输器,我们需要安装Go语言。

sudo apt-get install golang
在$ HOME目录中为Go创建一个文件夹:
mkdir ~/go; echo "export GOPATH=$HOME/go" >> ~/.bashrc
更新路径:
echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin" >> ~/.bashrc
现在转到$ GOPATH目录并创建子目录src,pkg和bin。这些目录构成Go的工作空间。
cd $GOPATH
mkdir src pkg bin
安装传输器
现在创建并移至Transporter的新目录。由于该实用程序是由Compose开发的,因此我们将目录称为compose。
mkdir -p $GOPATH/src/github.com/compose
cd $GOPATH/src/github.com/compose
这是将安装compose / transporter的位置。
克隆Transporter GitHub存储库:
git clone https://github.com/compose/transporter.git
移至新目录:
cd transporter
取得/ usr / lib / go目录的所有权:
sudo chown -R $USER /usr/lib/go
确保已为GCC安装了build-essential:
sudo apt-get install build-essential
运行go get命令以获取所有依赖项:
go get -a ./cmd/...
此步骤可能需要一段时间,因此请耐心等待。一旦完成,就可以构建Transporter。
go build -a ./cmd/...
如果一切顺利,它将完成而不会出现任何错误或警告。通过运行以下命令,检查传输器是否正确安装:
transporter
至此安装完成。
在mongoDB中创建一些示例数据。
然后,我们必须配置运输器。
Transporter需要一个配置文件(config.yaml),一个转换文件(myTransformation.js)和一个应用程序文件(application.js)才能将我们的数据从MongoDB迁移到Elasticsearch。
移至运输目录:
cd ~/go/src/github.com/compose/transporter
配置文件
如果愿意,可以看一下示例config.yaml文件。我们将备份原始文件,然后将其替换为我们自己的内容。
mv test/config.yaml test/config.yaml.00
新文件与此类似,但是更新了一些URI和其他一些设置以匹配我们服务器上的内容。让我们从此处复制内容,然后粘贴到新的config.yaml文件中。再次使用nano编辑器。
nano test/config.yaml
将以下内容复制到文件中。完成后,如前所述保存文件。
# api:
#   interval: 60s
#   uri: "http://requestb.in/13gerls1"
#   key: "48593282-b38d-4bf5-af58-f7327271e73d"
#   pid: "something-static"
nodes:
  localmongo:
    type: mongo
    uri: mongodb://localhost/foo
    tail: true
  es:
    type: elasticsearch
    uri: http://localhost:9200/
  timeseries:
    type: influx
    uri: influxdb://root:root@localhost:8086/compose
  debug:
    type: file
    uri: stdout://
  foofile:
    type: file
    uri: file:///tmp/foo
申请文件
现在,在测试目录中打开application.js文件。
nano test/application.js
用下面显示的内容替换文件的样本内容:
Source({name:"localmongo", namespace:"foo.bar"})
.transform({filename: "transformers/addFullName.js", namespace: "foo.bar"})
.save({name:"es", namespace:"foo.bar"});
转换文件
假设我们希望存储在Elasticsearch中的文档具有另一个名为fullName的字段。为此,我们需要创建一个新的转换文件test / transformers / addFullName.js。
nano test/transformers/addFullName.js
将以下内容粘贴到文件中。如前所述保存并退出。
module.exports = function(doc) {
console.log(JSON.stringify(doc)); //If you are curious you can listen in on what's changed and being copied.
  doc._id = doc.data._id['$oid'];  
  doc["fullName"] = doc["firstName"] + " " + doc["lastName"];
  return doc
}
第一行是解决Transporter处理MongoDB的ObjectId()字段的方式所必需的。第二行告诉Transporter将mongoDB的firstName和lastName串联起来以形成ES的fullName。
这是该示例的简单转换,但是使用少量JavaScript,您就可以在准备要搜索的数据时执行更复杂的数据操作。
执行转运车:
如果您有一个简单的MongoDB独立实例,则不会对其进行复制,不会有任何操作日志,并且Transporter将无法检测到更改。要将独立的MongoDB转换为单节点副本集,您需要使用 --replSet rs0 ( rs0 只是该集合的名称)启动服务器,并在运行时使用Mongo Shell登录并运行 rs.initiate()以使服务器进行自我配置。
确保您在运输目录中:
cd ~/go/src/github.com/compose/transporter
执行以下命令以同步数据:
transporter run --config ./test/config.yaml ./test/application.js

关于mongodb - Scrapy MongoDB和Elasticsearch同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634527/

相关文章:

elasticsearch - 基于前缀和自定义标记器的Elasticsearch自动建议

ruby-on-rails - Searchkick rails 地理空间搜索不起作用

python - 为什么我的 scrapy 抓取不出任何东西?

python - 如何使用 Selenium 抓取页面?

python - 尝试使用elasticsearch-dsl Python软件包访问Elasticsearch Cloud时的“Failed to establish a new connection”

python - Scrapy:向 xpath 数组添加变量

Java CompletableFuture.runAsync 递归...有潜在风险吗?

Mongodb计算所有按条件匹配的对象中的所有数组元素

mongodb - 为什么在 32 位限制下是 2 GB 而不是 4 GB?

ruby-on-rails - Mongoid 查找器不起作用?