Elasticsearch:使用 Docker 来安装 FSCrawler 并摄入 Word 及 PDF 文件

2,449 阅读5分钟

在我之前的文章 “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… 下载一些测试文档。它基本涵盖了所需要的测试文档的类型。从列表出来的文档后缀可以看出来,它目前支持如下的文件格式:

  • pdf
  • xml
  • txt
  • docx
  • png: 含有 ocr 的图片
  • html
  • json
  • mp3
  • odt
  • rtf
  • wav
  • xhtml

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,那么请参考如下的文章来安装好自己的 Elasticsearch 及 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

``![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

在第一次运行时,如果 ~/.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"

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

注意:上面显示的配置也意味着启动 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

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

注意:上面显示的配置也用于启动 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

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

请注意,我们配置的超级用户 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