import streamlit as st from search_utils import SemanticSearch def main(): st.set_page_config( page_title="Semantic Search Engine", page_icon="🔍", layout="wide" ) # Initialize search system first @st.cache_resource def init_search_system(): system = SemanticSearch() system.initialize_system() return system # Custom CSS moved outside cached function st.markdown(""" """, unsafe_allow_html=True) search_system = init_search_system() # Main UI components st.title("🔍 Semantic Search Engine") query = st.text_input("Enter your search query:", placeholder="Search documents...") if query: with st.spinner("🔍 Searching through documents..."): results = search_system.search(query, 5) if not results.empty: st.subheader("Top Results") for _, row in results.iterrows(): with st.expander(f"{row['title']} (Similarity: {row['similarity']:.1%})"): st.markdown(f"**Summary**: {row['summary']}") st.markdown(f"View Source", unsafe_allow_html=True) else: st.warning("No matching documents found") # System status sidebar with st.sidebar: st.subheader("System Status") st.metric("Total Documents", f"{search_system.metadata_mgr.total_docs:,}") st.metric("FAISS Shards", len(search_system.index_shards)) st.metric("Metadata Shards", len(search_system.metadata_mgr.shard_map)) # Sidebar controls outside main query block with st.sidebar: if st.button("Clear Cache"): st.cache_resource.clear() st.rerun() if __name__ == "__main__": main()