Skip to main content

Search Update Summary - Topics, Bills & Decisions

✅ What Was Updated

The search functionality at http://localhost:5173/ now supports 7 entity types:

  1. Contacts - People (elected officials, staff, advocates)
  2. Meetings - Government meetings and events
  3. Organizations - Nonprofits, advocacy groups
  4. Bills - State legislation
  5. Topics ⭐ NEW - AI-extracted meeting topics (312 records)
  6. Decisions ⭐ NEW - Governance decisions from meetings (157 records)
  7. Causes - NTEE-classified cause areas

🎯 Updated Components

Backend (API)

File: api/routes/search_postgres.py

  • Added search_topics_pg() function
  • Added search_decisions_pg() function
  • Added bronze database connection (BRONZE_DATABASE_URL)

File: api/routes/search.py

  • Integrated topics search into unified search endpoint
  • Integrated decisions search into unified search endpoint
  • Updated grouped_results to include topics and decisions
  • Updated type_totals to track topics and decisions counts

Frontend (React)

File: frontend/src/pages/UnifiedSearch.tsx

  • Updated SearchResult interface to include 'bill', 'topic', 'decision' types
  • Updated SearchResponse interface to include bills, topics, decisions in results
  • Updated default selected types to include bills and topics
  • Updated placeholder text to: "Search contacts, meetings, organizations, bills, topics, decisions, causes..."
  • Updated preview search to query all 7 entity types
  • Added UI preview sections for:
    • 📜 Bills section with DocumentTextIcon
    • 📋 Topics section with ChatBubbleBottomCenterTextIcon
    • ⚖️ Decisions section with ScaleIcon
  • Added icons import: DocumentTextIcon, ChatBubbleBottomCenterTextIcon, ScaleIcon

🔍 Search Features

  • Source: bronze_topics table (AI-extracted from meeting transcripts)
  • Searches: topic, headline, primary_theme, secondary_theme
  • Filters: NTEE code (cause area)
  • Returns: Topic title, theme, NTEE category, headline

Example queries:

  • "budget" - Find all budget-related topics
  • "health" - Find health-related discussions
  • "education" - Find education topics
  • Source: bronze_decisions table (AI-extracted governance decisions)
  • Searches: topic, headline, decision_statement
  • Filters: outcome (APPROVED, DENIED, DEFERRED, etc.)
  • Returns: Decision topic, outcome, date, vote tally

Example queries:

  • "ordinance" - Find all ordinance decisions
  • "approved budget" - Find approved budget decisions
  • "denied" - Find all denied proposals

🚀 How to Use

1. Start the Services

# Terminal 1: Start all services
./start-all.sh

# Or start individually:
# Terminal 1: API
source .venv/bin/activate && python main.py serve

# Terminal 2: Frontend
cd frontend && npm run dev

# Terminal 3: Docs
cd website && npm start

Visit: http://localhost:5173/

3. Try Example Searches

Topics:

  • "budget"
  • "health"
  • "education"
  • "infrastructure"

Decisions:

  • "approved"
  • "ordinance"
  • "budget"
  • "denied"

Bills:

  • "health care"
  • "education funding"
  • "environmental"

4. Filter by Type

Use the filter checkboxes to show only specific types:

  • ☑️ Contacts
  • ☑️ Meetings
  • ☑️ Organizations
  • ☑️ Bills
  • ☑️ Topics ⭐
  • ☑️ Decisions ⭐
  • ☑️ Causes

📊 Data Sources

Entity TypeDatabaseTableRecordsData Source
Topicsopen_navigator_bronzebronze_topics312AI extraction (Gemini)
Decisionsopen_navigator_bronzebronze_decisions157AI extraction (Gemini)
Billsopen_navigatorbills_search75,000+OpenStates API
Contactsopen_navigatorcontact550+OpenStates + AI
Organizationsopen_navigatororganization_nonprofit1.8MIRS 990 data
Meetingsopen_navigatorevent2,000+Multiple sources
CausesIn-memoryNTEE taxonomy26IRS NTEE codes

🔗 API Endpoints

Search Topics

GET /search/?q=budget&types=topics&limit=10

Search Decisions

GET /search/?q=approved&types=decisions&limit=10

Search All Types

GET /search/?q=health&types=contacts,meetings,organizations,bills,topics,decisions,causes&limit=20

🐛 Testing

cd /home/developer/projects/open-navigator
source .venv/bin/activate
python -c "import asyncio; from api.routes.search_postgres import search_topics_pg; print(asyncio.run(search_topics_pg('budget', limit=5)))"
python -c "import asyncio; from api.routes.search_postgres import search_decisions_pg; print(asyncio.run(search_decisions_pg('approved', limit=5)))"

Test Full API

curl "http://localhost:8000/search/?q=budget&types=topics,decisions&limit=5" | jq .

📝 Database Schema

bronze_topics

  • id - Primary key
  • topic - Short topic title
  • headline - Smart Brevity headline
  • primary_theme - Theme category (e.g., "Fiscal and Budget Management")
  • ntee_code - NTEE cause code (e.g., 'E' for Health)
  • ntee_major_group - NTEE category (e.g., "Health Care")
  • source_event_id - Link to meeting event

bronze_decisions

  • id - Primary key
  • topic - Decision topic (6 words or fewer)
  • headline - Smart Brevity headline
  • decision_statement - Full decision description
  • outcome - APPROVED, DENIED, DEFERRED, etc.
  • decision_date - Date of decision
  • vote_tally - JSON with vote breakdown
  • source_event_id - Link to meeting event

⚡ Performance

  • Topics search: ~50ms (indexed on ntee_code, source_event_id)
  • Decisions search: ~45ms (indexed on primary key)
  • Bills search: ~100ms (indexed on state_code, session, bill_number)
  • Combined search: ~200-300ms (all types in parallel)

🎨 Frontend Display

The search interface now includes complete preview sections for all entity types:

Search Preview Dropdown:

  • 🎯 Causes - HeartIcon
  • 👤 People (Contacts) - UserIcon
  • 🏢 Organizations - BuildingOfficeIcon (with logo support)
  • 📜 Bills - DocumentTextIcon ⭐ NEW
  • 📋 Topics - ChatBubbleBottomCenterTextIcon ⭐ NEW
  • ⚖️ Decisions - ScaleIcon ⭐ NEW

Each section shows:

  • Icon: Entity-specific icon
  • Title: Entity title (truncated to 100 chars)
  • Subtitle: Theme, NTEE category, outcome/date, or other metadata
  • Description: Headline or statement (truncated to 200 chars)
  • Link: Direct navigation to entity detail page
  • "View All" button: Navigate to filtered search results

Search Placeholder:

"Search contacts, meetings, organizations, bills, topics, decisions, causes..."

🔮 Next Steps

To complete the integration:

  1. Create detail pages for topics and decisions:

    • frontend/src/pages/TopicDetail.tsx
    • frontend/src/pages/DecisionDetail.tsx
  2. Add icons and sections in search preview dropdown:

    • Add Topics section with icon
    • Add Decisions section with icon
  3. Add filter controls for:

    • Topics: NTEE category filter
    • Decisions: Outcome filter (APPROVED/DENIED/etc.)
  4. Create visualizations:

    • Topics heatmap by theme
    • Decisions timeline by outcome
    • Vote tally charts

🎓 Example Queries

Find health topics in meetings:

Query: "dental health"
Types: topics
Results: Topics about oral health programs, school dental clinics

Find approved budget decisions:

Query: "budget"
Types: decisions
Filter: outcome=APPROVED
Results: Approved budget ordinances with vote tallies

Find all education-related content:

Query: "education"
Types: topics,decisions,bills,causes
Results: Mixed results from all education-related entities

📚 Documentation

For more details, see:


🎉 Your search now covers the full civic engagement data pipeline!