Как индексировать.PDF файл в ElasticSearch

Я новичок в ElasticSearch. Я провел очень простой учебник по созданию индексов. Я понимаю концепцию индексации. Я хочу, чтобы ElasticSearch выполнял поиск внутри файла.PDF. Основываясь на моем понимании создания индексов, кажется, мне нужно прочитать файл.PDF и извлечь все ключевые слова для индексирования. Но я не понимаю, какие шаги мне нужно выполнить. Как читать файл.PFD для извлечения ключевых слов.

Ответ 2

Похоже, что плагин elasticearch-mapper-attachment устарел в 5.0.0 (выпущен 26 октября 2016 года). В документации рекомендуется использовать модуль Ingest Attachment Processor Plugin в качестве замены.

Установить:

sudo bin/elasticsearch-plugin install ingest-attachment

См. Как индексировать PDF файл в Elasticsearch 5.0.0 с помощью плагина с доступом к файлам? для получения информации о том, как использовать плагин Ingest Attachment.

Ответ 3

Установите Elasticearch mapper-attachment plugin и используйте код, похожий на:

public String indexDocument(String filePath, DataDTO dto) {
        IndexResponse response = null;
        try {
            response = this.prepareIndexRequest("collectionName").setId(dto.getId())
                    .setSource(jsonBuilder().startObject()
                    .field("file", Base64.encodeFromFile(filePath))
                    .endObject()).setRefresh(true).execute().actionGet();
        } catch (ElasticsearchException e) {
            //
        } catch (IOException e) {
            //
        }
    return response.getId();
}

Ответ 5

Для моего проекта я также должен был сделать локальные файлы.PDF доступными для поиска. Я достиг этого:

  1. Извлеченные данные из файла.PDF с использованием Apache Tika, я использовал Apache Tika, потому что это дает мне свободу для извлечения данных из разных расширений с тем же конвейером.
  2. Используется выход Apache Tika для индексирования.

Обычно мой индекс выглядел так:

{filename: "FILENAME", filebody: "Данные извлечены из Apache Tika"}


Существует несколько различных решений, как упомянуто здесь, также с использованием Elasticearch mapper-attachment plugin - отличное решение. Я выбрал этот подход, потому что хотел работать с большими файлами и разными расширениями.

Ответ 6

Я нашел ниже код здесь PDF для упругого поиска, код извлекает PDF и вводит в упругий поиск

import PyPDF2
import re
import requests
import json
import os
from datetime import date

class ElasticModel:

    name = ""
    msg = ""

    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, 
            sort_keys=True, indent=4)

def __readPDF__(path):
    # pdf file object
    # you can find find the pdf file with complete code in below
    pdfFileObj = open(path, 'rb')
    # pdf reader object
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
    # number of pages in pdf
    print(pdfReader.numPages)
    # a page object
    pageObj = pdfReader.getPage(0)
    # extracting text from page.
    # this will print the text you can also save that into String
    line = pageObj.extractText() 
    line = line.replace("\n","")
    print(line)
    return line


#line = pageObj.extractText()

def __prepareElasticModel__(line, name):
    eModel = ElasticModel();

    eModel.name = name
    eModel.msg = line
    return eModel


def __sendToElasticSearch__(elasticModel):
    print("Name : " + str(eModel))

############################################
####  #CHANGE INDEX NAME IF NEEDED
#############################################
    index = "samplepdf"

    url = "http://localhost:9200/" + index +"/_doc?pretty"
    data = elasticModel.toJSON()
    #data = serialize(eModel)
    response = requests.post(url, data=data,headers={
                    'Content-Type':'application/json',
                    'Accept-Language':'en'

                })
    print("Url : " + url)
    print("Data : " + str(data))

    print("Request : " + str(requests))
    print("Response : " + str(response))


#################################
#Change pdf dir path
###################################
pdfdir = "C:/Users/abhis/Desktop/TemplatesPDF/SamplePdf"

listFiles = os.listdir(pdfdir)
for file in listFiles :
    path = pdfdir + "/" + file
    print(path)

    line = __readPDF__(path)
    eModel = __prepareElasticModel__(line, file)
    __sendToElasticSearch__(eModel)

Приведенный выше код извлекает образец PDF

enter image description here

Из приведенного выше примера pdf несколько полей (таких как Name и Msg) были извлечены с помощью регулярных выражений и вставлены в упругий поиск. Надеюсь, это поможет