# `ExUtcp.Search.Semantic`
[🔗](https://github.com/universal-tool-calling-protocol/elixir-utcp/blob/main/lib/ex_utcp/search/semantic.ex#L1)

Semantic search implementation for UTCP tools and providers.

Uses Haystack for full-text search and keyword extraction for intelligent tool discovery.

# `contextual_similarity`

```elixir
@spec contextual_similarity(ExUtcp.Types.tool(), [String.t()]) :: float()
```

Calculates contextual similarity based on tool categories and domains.

# `create_tools_index`

```elixir
@spec create_tools_index([ExUtcp.Types.tool()]) :: Haystack.t()
```

Creates a Haystack index from tools for full-text search.

# `extract_keywords`

```elixir
@spec extract_keywords(String.t()) :: [String.t()]
```

Extracts keywords from text for semantic analysis.

# `find_similar_tools`

```elixir
@spec find_similar_tools(ExUtcp.Types.tool(), [ExUtcp.Types.tool()], float()) ::
  list()
```

Finds similar tools based on semantic similarity.

# `keyword_similarity`

```elixir
@spec keyword_similarity([String.t()], [String.t()]) :: float()
```

Calculates semantic similarity between two sets of keywords.

# `search_providers`

```elixir
@spec search_providers(list(), String.t(), map()) :: list()
```

Searches providers using semantic matching.

# `search_tools`

```elixir
@spec search_tools([map()], String.t(), map()) :: [map()]
```

Searches tools using Haystack full-text search and semantic matching.

# `search_tools_with_haystack`

```elixir
@spec search_tools_with_haystack([map()], String.t(), map()) :: [map()]
```

Searches tools using Haystack full-text search.

# `search_tools_with_keywords`

```elixir
@spec search_tools_with_keywords([ExUtcp.Types.tool()], String.t(), map()) :: list()
```

Searches tools using keyword-based semantic matching.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
