在我之前的文章 “Elastic:导入 Word 及 PDF 文件到 Elasticsearch 中”,我详细描述了如何安装 FSCrawler 来摄入 Word 及 PDF 文件。在那篇文章中,我们使用了解压缩包的方法。在这篇文章中,我们来描述如何使用 Docker 的方法来进行安装并摄入需要的文件。 FSCrawler. 可以在地址 GitHub - dadoonet/fscrawler: Elasticsearch File System Crawler (FS Crawler) 找到。
准备文件
我们首先按照之前的文章 “Elastic:导入 Word 及 PDF 文件到 Elasticsearch 中” 中描述的那样创建几个简单的 Word 及 PDF 文件,并把它们置于我们的目录中:
1. $ pwd
2. /Users/liuxg/tmp/docs
3. $ ls
4. doc1.docx doc2.pdf doc3.docx
你也可以在地址 github.com/dadoonet/fs… 下载一些测试文档。它基本涵盖了所需要的测试文档的类型。从列表出来的文档后缀可以看出来,它目前支持如下的文件格式:
- xml
- txt
- docx
- png: 含有 ocr 的图片
- html
- json
- mp3
- odt
- rtf
- wav
- xhtml
安装
如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,那么请参考如下的文章来安装好自己的 Elasticsearch 及 Kibana。
- 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
- Kibana:如何在 Linux,MacOS 及 Windows上安装 Elastic 栈中的 Kibana
等安装好后,我们的 Elasticsearch 可以在地址 https://localhost:9200 来进行访问,也可以在你机器的私有地址下进行运行 https://privateIP:9200。你可以通过如下的命令来查看你机器的 IP 地址:
1. $ ifconfig | grep 192
2. inet 192.168.0.3 netmask 0xffffff00 broadcast 192.168.0.255
使用 Docker 来安装 FSCrawler
我们使用如下的命令来拉取 Docker 镜像:
docker pull dadoonet/fscrawler
1. $ docker pull dadoonet/fscrawler
2. Using default tag: latest
3. latest: Pulling from dadoonet/fscrawler
4. 1fe172e4850f: Pull complete
5. 44d3aa8d0766: Pull complete
6. 6ce99fdf16e8: Pull complete
7. 9c8cd828df6c: Pull complete
8. 4760215418fb: Pull complete
9. 8ac9abc1945a: Pull complete
10. Digest: sha256:2950edb12619187de9823303ed0cf1a4dc2219f8faa80e3a7bdfbe46cb690a69
11. Status: Downloaded newer image for dadoonet/fscrawler:latest
12. docker.io/dadoonet/fscrawler:latest
注意:该镜像非常大(1.2+gb),因为它包含 Tesseract 和所有经过训练的语言数据。 如果你根本不想使用 OCR,则可以通过拉取使用较小的镜像(大约 530mb)dadoonet/fscrawler:noocr
docker pull dadoonet/fscrawler:noocr
假设你的文档位于 ~/tmp 目录中,并且你希望将 fscrawler 作业存储在 ~/.fscrawler 中。 你可以使用以下命令运行 FSCrawler:
docker run -it --rm -v ~/.fscrawler:/root/.fscrawler -v ~/tmp:/tmp/es:ro dadoonet/fscrawler fscrawler job_name
针对我的情况,我的文档位于 ~/tmp/docs 目录中,我们使用如下的命令:
docker run -it --rm -v ~/.fscrawler:/root/.fscrawler -v ~/tmp/docs:/tmp/es:ro dadoonet/fscrawler fscrawler job_name
``
1. $ docker run -it --rm -v ~/.fscrawler:/root/.fscrawler -v ~/tmp/docs:/tmp/es:ro dadoonet/fscrawler fscrawler job_name
2. 07:24:32,475 INFO [f.console] ,----------------------------------------------------------------------------------------------------.
3. | ,---,. .--.--. ,----.. ,--, 2.10-SNAPSHOT |
4. | ,' .' | / / '. / / \ ,--.'| |
5. | ,---.' || : /`. / | : : __ ,-. .---.| | : __ ,-. |
6. | | | .'; | |--` . | ;. /,' ,'/ /| /. ./|: : ' ,' ,'/ /| |
7. | : : : | : ;_ . ; /--` ' | |' | ,--.--. .-'-. ' || ' | ,---. ' | |' | |
8. | : | |-, \ \ `. ; | ; | | ,'/ \ /___/ \: |' | | / \ | | ,' |
9. | | : ;/| `----. \| : | ' : / .--. .-. | .-'.. ' ' .| | : / / |' : / |
10. | | | .' __ \ \ |. | '___ | | ' \__\/: . ./___/ \: '' : |__ . ' / || | ' |
11. | ' : ' / /`--' /' ; : .'|; : | ," .--.; |. \ ' .\ | | '.'|' ; /|; : | |
12. | | | | '--'. / ' | '/ :| , ; / / ,. | \ \ ' \ |; : ;' | / || , ; |
13. | | : \ `--'---' | : / ---' ; : .' \ \ \ |--" | , / | : | ---' |
14. | | | ,' \ \ .' | , .-./ \ \ | ---`-' \ \ / |
15. | `----' `---` `--`---' '---" `----' |
16. +----------------------------------------------------------------------------------------------------+
17. | You know, for Files! |
18. | Made from France with Love |
19. | Source: https://github.com/dadoonet/fscrawler/ |
20. | Documentation: https://fscrawler.readthedocs.io/ |
21. `----------------------------------------------------------------------------------------------------'
23. 07:24:32,487 INFO [f.p.e.c.f.c.BootstrapChecks] Memory [Free/Total=Percent]: HEAP [160.6mb/2.8gb=5.48%], RAM [8.2gb/11.4gb=72.44%], Swap [1023.9mb/1023.9mb=100.0%].
24. 07:24:32,528 INFO [f.console] job [job_name] does not exist
25. 07:24:32,528 INFO [f.console] Do you want to create it (Y/N)?
26. y
27. 07:24:35,483 INFO [f.console] Settings have been created in [/root/.fscrawler/job_name/_settings.yaml]. Please review and edit before relaunch
``
在第一次运行时,如果 ~/.fscrawler 中尚不存在该作业,FSCrawler 将询问你是否要创建它:
注意:配置文件实际上存储在你机器上的 ~/.fscrawler/job_name/_settings.yaml 中。 请记住更改你的 elasticsearch 实例的 URL,因为容器将无法看到它在默认 127.0.0.1 下运行。 你将需要使用主机的实际 IP 地址。
我们接下来编辑文件 _settings.yaml 文件:
1. $ pwd
2. /Users/liuxg/.fscrawler/job_name
3. $ vi _settings.yaml
如上所示,我们需要做上面的配置。为了方便,我们特意设置 ssl_verification 为 false。你需要根据自己的 Elasticsearch 端点及用户账号信息进行修改。修改完后保存,我们再次运行 Docker:
我们进入到 Kibana 的页面,并进行查看:
GET _cat/indices
我们可以看到有两个新的索引已经生产:open job_name_folder 及 job_name。
使用 Docker compose
我们在一个目录里创建如下的文件结构:
针对 Elasticsearch,我们按照如下的配置来创建一个叫做 _settings.yaml 的文件:
`
1. ---
2. name: "idx"
3. fs:
4. indexed_chars: 100%
5. lang_detect: true
6. continue_on_error: true
7. ocr:
8. language: "eng"
9. enabled: true
10. pdf_strategy: "ocr_and_text"
11. elasticsearch:
12. nodes:
13. - url: "https://elasticsearch:9200"
14. username: "elastic"
15. password: "changeme"
16. ssl_verification: false
17. rest :
18. url: "http://fscrawler:8080"
`
注意:上面显示的配置也意味着启动 REST 接口。 它还使用英语激活文档的完整索引、语言检测和 ocr。 你可以根据需要调整此示例。
我们按照地址 github.com/dadoonet/fs… 来创建 docker-compose.yaml 文件:
docker-compose.yml
`
1. ---
2. version: "2.2"
4. services:
5. setup:
6. image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
7. volumes:
8. - certs:/usr/share/elasticsearch/config/certs
9. user: "0"
10. command: >
11. bash -c '
12. if [ x${ELASTIC_PASSWORD} == x ]; then
13. echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
14. exit 1;
15. elif [ x${KIBANA_PASSWORD} == x ]; then
16. echo "Set the KIBANA_PASSWORD environment variable in the .env file";
17. exit 1;
18. fi;
19. if [ ! -f certs/ca.zip ]; then
20. echo "Creating CA";
21. bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
22. unzip config/certs/ca.zip -d config/certs;
23. fi;
24. if [ ! -f certs/certs.zip ]; then
25. echo "Creating certs";
26. echo -ne \
27. "instances:\n"\
28. " - name: elasticsearch\n"\
29. " dns:\n"\
30. " - elasticsearch\n"\
31. " - localhost\n"\
32. " ip:\n"\
33. " - 127.0.0.1\n"\
34. > config/certs/instances.yml;
35. bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
36. unzip config/certs/certs.zip -d config/certs;
37. fi;
38. echo "Setting file permissions"
39. chown -R root:root config/certs;
40. find . -type d -exec chmod 750 \{\} \;;
41. find . -type f -exec chmod 640 \{\} \;;
42. echo "Waiting for Elasticsearch availability";
43. until curl -s --cacert config/certs/ca/ca.crt https://elasticsearch:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
44. echo "Setting kibana_system password";
45. until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://elasticsearch:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
46. echo "All done!";
47. '
48. healthcheck:
49. test: ["CMD-SHELL", "[ -f config/certs/elasticsearch/elasticsearch.crt ]"]
50. interval: 1s
51. timeout: 5s
52. retries: 120
54. elasticsearch:
55. depends_on:
56. setup:
57. condition: service_healthy
58. image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
59. volumes:
60. - certs:/usr/share/elasticsearch/config/certs
61. - esdata:/usr/share/elasticsearch/data
62. ports:
63. - ${ES_PORT}:9200
64. environment:
65. - node.name=elasticsearch
66. - cluster.name=${CLUSTER_NAME}
67. - cluster.initial_master_nodes=elasticsearch
68. - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
69. - bootstrap.memory_lock=true
70. - xpack.security.enabled=true
71. - xpack.security.http.ssl.enabled=true
72. - xpack.security.http.ssl.key=certs/elasticsearch/elasticsearch.key
73. - xpack.security.http.ssl.certificate=certs/elasticsearch/elasticsearch.crt
74. - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
75. - xpack.security.http.ssl.verification_mode=certificate
76. - xpack.security.transport.ssl.enabled=true
77. - xpack.security.transport.ssl.key=certs/elasticsearch/elasticsearch.key
78. - xpack.security.transport.ssl.certificate=certs/elasticsearch/elasticsearch.crt
79. - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
80. - xpack.security.transport.ssl.verification_mode=certificate
81. - xpack.license.self_generated.type=${LICENSE}
82. mem_limit: ${MEM_LIMIT}
83. ulimits:
84. memlock:
85. soft: -1
86. hard: -1
87. healthcheck:
88. test:
89. [
90. "CMD-SHELL",
91. "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
92. ]
93. interval: 10s
94. timeout: 10s
95. retries: 120
97. kibana:
98. depends_on:
99. elasticsearch:
100. condition: service_healthy
101. image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
102. volumes:
103. - certs:/usr/share/kibana/config/certs
104. - kibanadata:/usr/share/kibana/data
105. ports:
106. - ${KIBANA_PORT}:5601
107. environment:
108. - SERVERNAME=kibana
109. - ELASTICSEARCH_HOSTS=https://elasticsearch:9200
110. - ELASTICSEARCH_USERNAME=kibana_system
111. - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
112. - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
113. - ENTERPRISESEARCH_HOST=http://enterprisesearch:${ENTERPRISE_SEARCH_PORT}
114. mem_limit: ${MEM_LIMIT}
115. healthcheck:
116. test:
117. [
118. "CMD-SHELL",
119. "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
120. ]
121. interval: 10s
122. timeout: 10s
123. retries: 120
125. # FSCrawler
126. fscrawler:
127. image: dadoonet/fscrawler:$FSCRAWLER_VERSION
128. container_name: fscrawler
129. restart: always
130. volumes:
131. - ~/tmp/docs/:/tmp/es:ro
132. - ${PWD}/config:/root/.fscrawler
133. - ${PWD}/logs:/usr/share/fscrawler/logs
134. depends_on:
135. elasticsearch:
136. condition: service_healthy
137. ports:
138. - ${FSCRAWLER_PORT}:8080
139. command: fscrawler job_name --restart --rest
141. volumes:
142. certs:
143. driver: local
144. esdata:
145. driver: local
146. kibanadata:
147. driver: local
`
注意:上面显示的配置也用于启动 Kibana。 如果不需要,可以跳过该部分。
在上面,我把测试文档置于路径 ~/tmp/docs/ 中。你可以根据自己的文档路径进行修改。同时,我们把 job_name 定义为我们的任务名称。如果你修改为其它的名称,那么你需要在上面的文档中进行替换,并同时修改相应的目录名称。
细心的开发者可能会发现,这里的 docker-compose.yml 文件和我之前的文章 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x” 里的是非常相似的。在这里就不一一进行详述了。
同时为了能够配置上面的 docker-compose.yml 中的环境变量,我们还需要在 docker-compose.yml 所在的目录里创建一个如下的文件:
.env
`
1. # FSCrawler Settings
2. FSCRAWLER_VERSION=2.10-SNAPSHOT
3. FSCRAWLER_PORT=8080
5. # Password for the 'elastic' user (at least 6 characters)
6. ELASTIC_PASSWORD=changeme
8. # Password for the 'kibana_system' user (at least 6 characters)
9. KIBANA_PASSWORD=changeme
11. # Version of Elastic products
12. STACK_VERSION=8.3.3
14. # Set the cluster name
15. CLUSTER_NAME=docker-cluster
17. # Set to 'basic' or 'trial' to automatically start the 30-day trial
18. #LICENSE=basic
19. LICENSE=trial
21. # Port to expose Elasticsearch HTTP API to the host
22. ES_PORT=9200
24. # Port to expose Kibana to the host
25. KIBANA_PORT=5601
27. # Enterprise Search settings
28. ENTERPRISE_SEARCH_PORT=3002
29. ENCRYPTION_KEYS=q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D
31. # Increase or decrease based on the available host memory (in bytes)
32. MEM_LIMIT=1073741824
34. # Project namespace (defaults to the current folder name if not set)
35. COMPOSE_PROJECT_NAME=fscrawler
`
请注意,我们配置的超级用户 elastic 的密码为 changeme。经过上面的配置后,我们的文件结构如下:
1. $ pwd
2. /Users/liuxg/fscrawler
3. $ tree -aL 3
4. .
5. ├── .env
6. ├── config
7. │ └── job_name
8. │ └── _settings.yaml
9. ├── data
10. ├── docker-compose.yml
11. └── logs
然后,你可以运行整个堆栈,包括 FSCrawler:
docker-compose up -d
如果你不想它在后台运行的话,你可以使用如下的方式来运行:
docker-compose up
我们来登录 Kibana:
使用如下的命令来查看最新的索引:
GET _cat/indices
从上面的输出结果来看,它已经成功地对我们的文档进行了上传。
参考:
【1】 Download FSCrawler — FSCrawler 2.10-SNAPSHOT documentation