Я новичок в ElasticSearch. Я провел очень простой учебник по созданию индексов. Я понимаю концепцию индексации. Я хочу, чтобы ElasticSearch выполнял поиск внутри файла.PDF. Основываясь на моем понимании создания индексов, кажется, мне нужно прочитать файл.PDF и извлечь все ключевые слова для индексирования. Но я не понимаю, какие шаги мне нужно выполнить. Как читать файл.PFD для извлечения ключевых слов.
Как индексировать.PDF файл в ElasticSearch
Ответ 1
Вам нужно проверить плагин elasticsearch-mapper-attachments, так как он, скорее всего, поможет вам достичь того, что вам нужно.
Ответ 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();
}
Ответ 4
Как упоминалось, плагин elasticsearch-mapper-attachment устарел, и вместо него можно использовать плагин Ingest Attachment
https://www.elastic.co/guide/en/elasticsearch/plugins/current/ingest-attachment.html
Ответ 5
Для моего проекта я также должен был сделать локальные файлы.PDF доступными для поиска. Я достиг этого:
- Извлеченные данные из файла.PDF с использованием Apache Tika, я использовал Apache Tika, потому что это дает мне свободу для извлечения данных из разных расширений с тем же конвейером.
- Используется выход 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
Из приведенного выше примера pdf несколько полей (таких как Name и Msg) были извлечены с помощью регулярных выражений и вставлены в упругий поиск. Надеюсь, это поможет