ElasticSearch Klasör İndeksleyici
Hiç Windows'ta bir klasör içinde arama yapmak istediniz mi, ancak bu dosya için arama sonsuza kadar sürüyor mu? Çok sayıda pdf dosyanız veya docx belgeniz var ve bir cümleyi nerede okuduğunuzu hatırlamıyor veya belirli bir makaleyi mi arıyorsunuz? Kurumsal / kurumsal olmayan uygulamanız için küçük bir arama motoru oluşturmak mı istiyorsunuz? Kendinizi yukarıdaki durumlardan birinde bulursanız veya bir klasörün ve alt klasörlerinin içeriğini dizine eklemek için ElasticSearch'ü nasıl kullanacağınızı merak ediyorsanız, bu makale tam size göre.
sahneyi ayarlamak
Bu makalenin geliştirmesi, basit bir Windows Ortamında gerçekleştirilir. Bu makalenin yazıldığı sırada, kullanılmakta olan ElasticSearch sürümü 8.5.3'tür . Bu Makalenin sonunda, ElasticSearch Örneği URL'si verilen ve Klasör Konumunun bu klasörün içeriğini söz konusu ELK Örneğine endeksleyen, tamamen çalışan bir GUI Uygulaması oluşturmuş olacağız. Dizin adı kullanıcı arayüzünden girilebilir ve mevcut veya yeni olabilir.
Elastic Cluster, birden çok örnekle her zamanki gibi kurulabilir. Ancak, örneği tek bir bilgisayarda çalıştırdığımız için örneği tek düğüm modunda çalışacak şekilde yapılandırabiliriz. Bu adımla ilgili yapılandırma detayları aşağıdaki bölümlerde detaylandırılmıştır.
GUI uygulamasını ve indeksleyiciyi oluşturmak için zengin kütüphaneleri, kısa ve kolay geliştirmesi nedeniyle Python kullanmaya karar verdim . 250 satırdan daha az kodla, docx , pdf ve metin indeksleme özelliklerine sahip tamamen işlevsel bir indeksleyici yazılır.
ElasticSearch Kurulumu
Elasticsearch zip dosyasını indirdikten sonra onu bir dizine çıkardım. Örnek her zaman yerel olarak çalıştırılacağından, ilk adım güvenliği devre dışı bırakmaktır. Ancak, üretim seviyesi uzak ortam için güvenliği bir kenara bırakmak asla iyi bir uygulama değildir. Ardından, düğümün localhost'ta çalışması gerektiğini ve localhost'ta yalnızca tek bir düğüm bulması gerektiğini belirtiriz. Portlar değişmez. (http için 9200, tcp için 9300)
yml yapılandırması (elasticsearch.yml) aşağıda bulunabilir:
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
enabled: false
xpack.security.transport.ssl:
enabled: false
http.host: 0.0.0.0
network.host: 0.0.0.0
discovery.type: single-node
-Xms4g
-Xmx4g
Bu makalenin amacı bir elasticsearch örneğinin nasıl çalıştırılacağını tartışmak değil, bunun yerine Python gibi üst düzey bir programlama dili kullanarak bir klasörü ve alt klasörlerini indekslemek için nasıl kullanılacağını tartışmak olduğundan, "eğlenceli kısma" geçelim.
Kullanıcı Arayüzünü Tasarlamak
Elasticsearch klasör indeksleyici, önce bir komut satırı uygulamasıydı, ancak geliştirme ilerledikçe bunun için basit bir GUI oluşturmaya karar verdim. GUI'yi kurmak için tkinter kullandım ama diğer herhangi bir python gui kütüphanesi yapacak.
import tkinter as tk
from PIL import ImageTk, Image
import tkinter.ttk as ttk
root= tk.Tk('Chipster')
root.title("ElasticSearch Folder Indexer ")
root.resizable(False,False)
canvas1 = tk.Canvas(root, width=400, height=600, relief='raised')
img = ImageTk.PhotoImage(Image.open("elk.png"))
img.width = 0.1
img.height = 0.1
imglabel = tk.Label(root,image=img)
canvas1.create_window(20,30,window = imglabel)
label1 = tk.Label(root, text='ElasticSearch Folder Indexer', background="lightblue")
label1.config(font=('Serif', 14, "bold"))
canvas1.create_window(230, 78, window=label1)
label2 = tk.Label(root, text='Enter the path of the folder to be indexed:')
label2.config(font=('helvetica', 10))
canvas1.create_window(200, 140, window=label2)
entry1 = tk.Entry(root , width=40)
canvas1.create_window(200, 160, window=entry1)
label3 = tk.Label(root, text='ElasticSearch Instance (ex: http://localhost:9200):')
label3.config(font=('helvetica', 10))
canvas1.create_window(200, 200, window=label3)
entry2 = tk.Entry(root,width=40)
canvas1.create_window(200, 220, window=entry2)
label4 = tk.Label(root, text='Index Name:')
label4.config(font=('helvetica', 10))
canvas1.create_window(200, 260, window=label4)
entry3 = tk.Entry(root,width=40)
canvas1.create_window(200, 280, window=entry3)
text = tk.Text(root, height=10,width=40)
progress_label = tk.Label(root,text="")
progress_label.config(font=("helvetica",12,"bold"))
client = ''
connected= False
def connect():
# Code that handles elasticsearch connection
return
def index():
# Code that handles elasticsearch indexing
return
def start_combine_in_bg():
# Threading to show real time logs in the Text Widget
style = ttk.Style()
style.theme_use('alt')
style.configure('TButton', background = 'red', foreground = 'white', width = 10, borderwidth=1, focusthickness=4, focuscolor='none' , font=('Sans serif', 12, "bold"))
style.map('TButton', background=[('active','indianred')])
button1 = ttk.Button(text='Index', command=start_combine_in_bg)
button12 = tk.Button(text='Connect' , command = connect , background="green" , foreground = 'white' ,width = 8, font=('Sans serif', 10, "bold"))
# button1.pack()
canvas1.create_window(250, 340, window=button1)
canvas1.create_window(150, 340, window=button12)
canvas1.create_window(200,370, window=progress_label)
canvas1.create_window(200,490,window=text)
canvas1.pack()
root.mainloop()
Index butonu tıklandığında ElasticSearch indeksleme başlar. Ancak, konsolda bir şey (uygulamamızdaki metin nesnesi) gösterebilmek istiyorsak, koda eklenecek gerçek zamanlı metin gönderebilmeliyiz. Hem GUI hem de İndeksleme mantığı aynı iş parçacığında çalışıyorsa, GUI işleme yalnızca tüm indeksleme süreci tamamlandıktan sonra devam edecek ve tüm süreç boyunca neyin yanlış olduğunu merak eden donmuş bir kullanıcı arayüzü ile sıkışıp kalacağız. Bundan kaçınmak için indekslemeyi bir arka plan iş parçacığında çalıştırıyoruz. Aşağıda tanımlanan start_combine_in_bg işlevinin amacı budur. İş parçacığının hedefi, yürütülecek çağrılan işlevdir, bu da dizin işlevidir.
def start_combine_in_bg():
threading.Thread(target=index).start()
def connect():
global client
elk_url = entry2.get()
if elk_url is None or not elk_url:
client = Elasticsearch("http://localhost:9200")
else:
client = Elasticsearch(elk_url)
global connected
connected = True
text.insert(tk.END ,'Existing Indices')
indices = client.indices.get_alias()
for index in indices:
text.insert(tk.END ,'\n'+str(index))
print(indices)
return
İndeksleme mantığının gerçekleştirildiği 2 ana fonksiyon vardır. İlki, aynı zamanda bir tür sarıcı olan indeks işlevidir. Mantığı basittir ve aşağıda gösterilmiştir. İndeks butonu tıklandığında bu fonksiyon çağrılacaktır.
def index():
if connected is False:
connect()
print("INDEX Clicked")
dir_to_index = entry1.get()
if os.path.isdir(dir_to_index) is False:
all_files = get_files_in_dir('.')
else:
all_files = get_files_in_dir(dir_to_index)
text.insert(tk.END,"TEST" ) # "\n " + "TOTAL FILES:", len( all_files )
try:
resp = helpers.bulk(
client,
yield_docs( all_files,text,entry3.get() , progress_label )
)
text.insert (tk.END,"\nhelpers.bulk() RESPONSE:"+ str(resp))
text.insert (tk.END,"RESPONSE TYPE:"+ str(type(resp)))
except Exception as err:
print("\nhelpers.bulk() ERROR:", str(err))
text.see(tk.END)
return
def yield_docs(all_files, textB: tk.Text , index, label: tk.Label):
if not index or index is None or len(index) == 0:
textB.insert(tk.END ,"\nNo Index Provided")
return
count = 0
for _id, _file in enumerate(all_files):
count+=1
label.configure(text="File:"+str(count) + "/" + str(len(all_files)))
textB.insert(tk.END ,"\nIndexing : " + _file)
textB.see(tk.END)
file_name = _file[ _file.rfind(slash)+1:]
try:
if file_name.lower().endswith(('.html' , '.txt' , '.php' ,'.htm')) is True :
data = get_data_from_text_file( _file )
data = "".join( data )
doc_source = {
"file_name": file_name,
"data": data ,
"file_path":_file
}
elif file_name.lower().endswith((".docx", ".doc")) is True :
pages = getText(_file)
for page in pages:
doc_source = {
"file_name": file_name,
"data": page,
"file_path":_file
}
yield {
"_index": index,
"_source": doc_source
}
elif file_name.lower().endswith((".pdf")) is True :
print("Ends with pdf")
pages = get_text(_file)
for page in pages:
doc_source = {
"file_name": file_name,
"data": page,
"file_path":_file
}
yield {
"_index": index,
"_source": doc_source
}
else:
doc_source = {
"file_name": file_name,
"data": _file,
"file_path":_file
}
yield {
"_index": index,
"_source": doc_source
}
except Exception as err:
print('\nError ',err)
doc_source = {
"file_name": file_name,
"data": _file,
"file_path":_file
}
yield {
"_index": index,
"_source": doc_source
}
Kapanış Konuşmaları
ElasticSearch klasör indeksleyici, yalnızca geliştiriciler için değil, diğer insanlar için de birçok uygulanabilir kullanım durumuna sahiptir. Bu, klasör indeksleme ve arama için tamamen işlevsel bir platform haline gelecek şekilde genişletilebilir. Şu anda arama kısmı harici bir uygulama ile veya postacı aracılığıyla yapılabilmektedir. Klasördeki belirli bir dosyayı, belgelerdeki belirli metinleri veya kodlama dosyalarındaki belirli kod parçalarını aramak için kullanılabilir.
Python önceden yüklenmemiş Windows PC'lerde çalıştırılabilen bu uygulamanın bir dağıtımı, dist klasörünün içindeki aşağıdaki GitHub bağlantısında bulunabilir. Klasör indeksleyiciyi çalıştırmak için, ui klasörü içindeki ui.exe'yi çalıştırmak yeterlidir.
Github:https://github.com/joanjanku2000/elk-folder-indexer/tree/latest
Buraya kadar geldiysen ilgin için teşekkür ederim. Şerefe.
© Joan Janku 2022

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































