#c# #search #amazon-s3
#c# #Поиск #amazon-s3
Вопрос:
У меня есть корзина на S3, в которой у меня есть большое количество текстовых файлов, PDF, doc.у каждого файла есть другое имя. Я хочу выполнить поиск по некоторому тексту в этих файлах.
Для примера у меня есть файлы, указанные ниже :
- abc/myfolder/abac.txt
- abc/myfolder/abacpfd.pdf
- abc/myfolder/abacpfd.doc
и я хочу выполнить поиск текста типа «Я человек» в вышеуказанных файлах. если текст содержится в этих файлах, верните имя файла
Как этого добиться? Возможно ли это вообще с c #?
Комментарии:
1. есть ли у вас файлы какого-либо другого типа, кроме txt, pdf, doc?
2. @MihirDave Нет, у меня нет
3. И примерно при какой частоте будет запущен поиск? Например, 5 раз в минуту или раз в час
4. Это зависит от пользователей, если несколько пользователей хотят выполнять поиск одновременно, поэтому количество идет от 20 до 50 в секунду.
5. Хорошо, и насколько велики ваши файлы? и приблизительно общий размер всех файлов
Ответ №1:
Amazon S3 не предоставляет никаких сервисов, которые касаются содержимого объектов.
Вам нужно будет запустить какую-либо форму программного обеспечения, которое сканирует и индексирует содержимое файлов S3 (например, Elasticsearch).
Ответ №2:
Вот руководство, в котором используются Tika (для распознавания PDF) и OpenSearch (для поисковой системы) для поиска содержимого PDF-файлов в корзине S3:
import boto3
from tika import parser
from opensearchpy import OpenSearch
from config import *
import sys
# opensearch object
os = OpenSearch(opensearch_uri)
s3_file_name="prescription.pdf"
bucket_name="mixpeek-demo"
def download_file():
"""Download the file
:param str s3_file_name: name of s3 file
:param str bucket_name: bucket name of where the s3 file is stored
"""
# s3 boto3 client instantiation
s3_client = boto3.client(
's3',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name
)
# open in memory
with open(s3_file_name, 'wb') as file:
s3_client.download_fileobj(
bucket_name,
s3_file_name,
file
)
print("file downloaded")
# parse the file
parsed_pdf_content = parser.from_file(s3_file_name)['content']
print("file contents extracted")
# insert parsed pdf content into elasticsearch
insert_into_search_engine(s3_file_name, parsed_pdf_content)
print("file contents inserted into search engine")
def insert_into_search_engine(s3_file_name, parsed_pdf_content):
"""Download the file
:param str s3_file_name: name of s3 file
:param str parsed_pdf_content: extracted contents of PDF file
"""
doc = {
"filename": s3_file_name,
"parsed_pdf_content": parsed_pdf_content
}
# insert
resp = os.index(
index = index_name,
body = doc,
id = 1,
refresh = True
)
print('nAdding document:')
print(resp)
def create_index():
"""Create the index
"""
index_body = {
'settings': {
'index': {
'number_of_shards': 1
}
}
}
response = os.indices.create(index_name, body=index_body)
print('nCreating index:')
print(response)
if __name__ == '__main__':
globals()[sys.argv[1]]()
полное руководство:https://medium.com/@mixpeek/search-text-from-pdf-files-stored-in-an-s3-bucket-2f10947eebd3
Соответствующий репозиторий github:https://github.com/mixpeek/pdf-search-s3
Ответ №3:
Точно, у меня была эта проблема, но каким-то образом я решил ее, не используя подход поиска. Если я не мог найти решение, я собирался попробовать этот проект с открытым исходным кодом: filestash
Комментарии:
1. Ферхат, у тебя есть шанс попробовать Filestash?
2. К сожалению, нет, Керем. Но я могу сказать, что, насколько я помню (неясно, поэтому вам нужно проверить более подробно), это не программное решение для полнотекстового поиска. Я имею в виду, что для этого нет sdk или API. Я собирался использовать его для решения проблемы с отладкой в моем локальном. Мы подозревали, что в некоторых файлах отсутствует содержимое.