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


    在我之前的文章 “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

    你也可以在地址 https://github.com/dadoonet/fscrawler/tree/master/test-documents/src/main/resources/documents 下载一些测试文档。它基本涵盖了所需要的测试文档的类型。从列表出来的文档后缀可以看出来,它目前支持如下的文件格式:

    • 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. `----------------------------------------------------------------------------------------------------'
    22. 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%].
    23. 07:24:32,528 INFO [f.console] job [job_name] does not exist
    24. 07:24:32,528 INFO [f.console] Do you want to create it (Y/N)?
    25. y
    26. 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。 你可以根据需要调整此示例。

    我们按照地址 https://github.com/dadoonet/fscrawler/blob/master/contrib/docker-compose-example-elasticsearch/docker-compose.yml 来创建 docker-compose.yaml 文件:

    docker-compose.yml

    1. ---
    2. version: "2.2"
    3. services:
    4. setup:
    5. image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    6. volumes:
    7. - certs:/usr/share/elasticsearch/config/certs
    8. user: "0"
    9. command: >
    10. bash -c '
    11. if [ x${ELASTIC_PASSWORD} == x ]; then
    12. echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
    13. exit 1;
    14. elif [ x${KIBANA_PASSWORD} == x ]; then
    15. echo "Set the KIBANA_PASSWORD environment variable in the .env file";
    16. exit 1;
    17. fi;
    18. if [ ! -f certs/ca.zip ]; then
    19. echo "Creating CA";
    20. bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
    21. unzip config/certs/ca.zip -d config/certs;
    22. fi;
    23. if [ ! -f certs/certs.zip ]; then
    24. echo "Creating certs";
    25. echo -ne \
    26. "instances:\n"\
    27. " - name: elasticsearch\n"\
    28. " dns:\n"\
    29. " - elasticsearch\n"\
    30. " - localhost\n"\
    31. " ip:\n"\
    32. " - 127.0.0.1\n"\
    33. > config/certs/instances.yml;
    34. 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;
    35. unzip config/certs/certs.zip -d config/certs;
    36. fi;
    37. echo "Setting file permissions"
    38. chown -R root:root config/certs;
    39. find . -type d -exec chmod 750 \{\} \;;
    40. find . -type f -exec chmod 640 \{\} \;;
    41. echo "Waiting for Elasticsearch availability";
    42. until curl -s --cacert config/certs/ca/ca.crt https://elasticsearch:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
    43. echo "Setting kibana_system password";
    44. 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;
    45. echo "All done!";
    46. '
    47. healthcheck:
    48. test: ["CMD-SHELL", "[ -f config/certs/elasticsearch/elasticsearch.crt ]"]
    49. interval: 1s
    50. timeout: 5s
    51. retries: 120
    52. elasticsearch:
    53. depends_on:
    54. setup:
    55. condition: service_healthy
    56. image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    57. volumes:
    58. - certs:/usr/share/elasticsearch/config/certs
    59. - esdata:/usr/share/elasticsearch/data
    60. ports:
    61. - ${ES_PORT}:9200
    62. environment:
    63. - node.name=elasticsearch
    64. - cluster.name=${CLUSTER_NAME}
    65. - cluster.initial_master_nodes=elasticsearch
    66. - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
    67. - bootstrap.memory_lock=true
    68. - xpack.security.enabled=true
    69. - xpack.security.http.ssl.enabled=true
    70. - xpack.security.http.ssl.key=certs/elasticsearch/elasticsearch.key
    71. - xpack.security.http.ssl.certificate=certs/elasticsearch/elasticsearch.crt
    72. - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
    73. - xpack.security.http.ssl.verification_mode=certificate
    74. - xpack.security.transport.ssl.enabled=true
    75. - xpack.security.transport.ssl.key=certs/elasticsearch/elasticsearch.key
    76. - xpack.security.transport.ssl.certificate=certs/elasticsearch/elasticsearch.crt
    77. - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
    78. - xpack.security.transport.ssl.verification_mode=certificate
    79. - xpack.license.self_generated.type=${LICENSE}
    80. mem_limit: ${MEM_LIMIT}
    81. ulimits:
    82. memlock:
    83. soft: -1
    84. hard: -1
    85. healthcheck:
    86. test:
    87. [
    88. "CMD-SHELL",
    89. "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
    90. ]
    91. interval: 10s
    92. timeout: 10s
    93. retries: 120
    94. kibana:
    95. depends_on:
    96. elasticsearch:
    97. condition: service_healthy
    98. image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    99. volumes:
    100. - certs:/usr/share/kibana/config/certs
    101. - kibanadata:/usr/share/kibana/data
    102. ports:
    103. - ${KIBANA_PORT}:5601
    104. environment:
    105. - SERVERNAME=kibana
    106. - ELASTICSEARCH_HOSTS=https://elasticsearch:9200
    107. - ELASTICSEARCH_USERNAME=kibana_system
    108. - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
    109. - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    110. - ENTERPRISESEARCH_HOST=http://enterprisesearch:${ENTERPRISE_SEARCH_PORT}
    111. mem_limit: ${MEM_LIMIT}
    112. healthcheck:
    113. test:
    114. [
    115. "CMD-SHELL",
    116. "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
    117. ]
    118. interval: 10s
    119. timeout: 10s
    120. retries: 120
    121. # FSCrawler
    122. fscrawler:
    123. image: dadoonet/fscrawler:$FSCRAWLER_VERSION
    124. container_name: fscrawler
    125. restart: always
    126. volumes:
    127. - ~/tmp/docs/:/tmp/es:ro
    128. - ${PWD}/config:/root/.fscrawler
    129. - ${PWD}/logs:/usr/share/fscrawler/logs
    130. depends_on:
    131. elasticsearch:
    132. condition: service_healthy
    133. ports:
    134. - ${FSCRAWLER_PORT}:8080
    135. command: fscrawler job_name --restart --rest
    136. volumes:
    137. certs:
    138. driver: local
    139. esdata:
    140. driver: local
    141. kibanadata:
    142. 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
    4. # Password for the 'elastic' user (at least 6 characters)
    5. ELASTIC_PASSWORD=changeme
    6. # Password for the 'kibana_system' user (at least 6 characters)
    7. KIBANA_PASSWORD=changeme
    8. # Version of Elastic products
    9. STACK_VERSION=8.3.3
    10. # Set the cluster name
    11. CLUSTER_NAME=docker-cluster
    12. # Set to 'basic' or 'trial' to automatically start the 30-day trial
    13. #LICENSE=basic
    14. LICENSE=trial
    15. # Port to expose Elasticsearch HTTP API to the host
    16. ES_PORT=9200
    17. # Port to expose Kibana to the host
    18. KIBANA_PORT=5601
    19. # Enterprise Search settings
    20. ENTERPRISE_SEARCH_PORT=3002
    21. ENCRYPTION_KEYS=q3t6w9z$C&F)J@McQfTjWnZr4u7x!A%D
    22. # Increase or decrease based on the available host memory (in bytes)
    23. MEM_LIMIT=1073741824
    24. # Project namespace (defaults to the current folder name if not set)
    25. 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

  • 相关阅读:
    未来10年,NAND 与DRAM依然是存储主角
    坚信人类记忆是以大分子物质存储的朋友们请看过来
    《Head First HTML5 javascript》第9章 认识对象
    ESP8266-Arduino编程实例-LM75温度传感器驱动
    算法--排序算法效率比较
    RabbitMQ、RocketMQ、Kafka常见消息队列不得不知道的事
    振弦采集仪和传感器形成完整链条的岩土工程解决方案
    【Java】Assert.assertEquals断言
    MySQL:函数盘点
    MySQL——表的插入
  • 原文地址:https://blog.csdn.net/UbuntuTouch/article/details/126120290