# app.py import streamlit as st from search_utils import SemanticSearch @st.cache_resource def init_search_system(): search_system = SemanticSearch() search_system.initialize_system() return search_system def format_source(url): """Convert URL to clickable link""" return f'🌐 Source' st.set_page_config( page_title="Semantic Search Engine", page_icon="🔍", layout="wide" ) search_system = init_search_system() # Custom CSS for better link display st.markdown(""" """, unsafe_allow_html=True) # Search interface st.title("🔍 Semantic Search Engine") query = st.text_input("Search knowledge base:", placeholder="Enter your question...") if query: with st.spinner("Searching through documents..."): results = search_system.search(query, 5) # Format sources as links results['source'] = results['source'].apply( lambda x: f'🌐 View Source' ) # Display results with HTML st.markdown("### Search Results") for _, row in results.iterrows(): with st.container(border=True): st.markdown(f"**{row['title']}**") st.markdown(row['summary']) st.markdown(row['source'], unsafe_allow_html=True) st.progress(float(row['similarity'])) # Sidebar information with st.sidebar: st.markdown("### System Status") st.metric("Loaded Documents", f"{len(search_system.metadata_mgr.shard_map):,}") st.metric("Index Shards", len(search_system.index_shards))