matchete 0.0.1

A fast and flexible matcher for comparing and diffing data structures.
Documentation
# Matchete

Matchete is a versatile Rust library for similarity matching between query and candidate items. Designed for flexibility, it enables custom similarity metrics, weighted metric combinations, and configurable matching behavior via a builder pattern. Whether you're building search engines, recommendation systems, or fuzzy matching tools, Matchete provides a robust, generic framework that works with any data types implementing `Clone` and `Debug`.

The name *Matchete* draws inspiration from "machete," evoking precision and strength in cutting through complex matching tasks, while playfully nodding to its core purpose: finding the best *match*.

## Features

- **Generic Matching**: Supports any query and candidate types with `Clone` and `Debug` traits.
- **Custom Metrics**: Define tailored similarity metrics via the `SimilarityMetric` trait.
- **Weighted Scoring**: Combine multiple metrics with adjustable weights.
- **Composite Matching**: Use `MultiMatcher` to aggregate results from multiple matchers.
- **Flexible Configuration**: Set thresholds, conditional rules, and options with `MatcherBuilder`.
- **Detailed Insights**: Access per-metric scores and match types for in-depth analysis.
- **Extensible**: Easily add new metrics or strategies to suit your needs.

## Installation

Add Matchete to your project by including it in your `Cargo.toml`:

```toml
[dependencies]
matchete = "0.0.1"  # Replace with the actual version
```

Ensure you have [Rust](https://www.rust-lang.org/tools/install) installed via rustup.

## Usage

Matchete offers a simple yet powerful API for matching tasks. Below is a basic example of string matching with a custom metric. For more examples, see the [Examples](#examples) section.

```rust
use matchete::{Matcher, SimilarityMetric};

// Define a simple string similarity metric
struct SimpleMetric;

impl SimilarityMetric<String, String> for SimpleMetric {
    fn calculate(&self, query: &String, candidate: &String) -> f64 {
        if query == candidate { 1.0 } else { 0.5 }
    }

    fn id(&self) -> &str { "simple" }
}

fn main() {
    // Create a matcher
    let matcher = Matcher::<String, String>::new()
        .with_metric(SimpleMetric, 1.0)
        .with_threshold(0.6);

    // Match a query against candidates
    let query = String::from("hello");
    let candidates = vec![String::from("hello"), String::from("world")];
    if let Some(result) = matcher.find_best_match(&query, &candidates) {
        println!("Best match: {} (score: {:.2})", result.candidate, result.score);
    }
}
```

## Examples

The `examples` folder contains practical demonstrations of Matchete's capabilities:

- `basic_string_matching.rs`: Simple string matching with a single metric.
- `multiple_metrics.rs`: Combining metrics using `MatcherBuilder` with conditional thresholds.
- `numeric_matching.rs`: Matching `f64` numbers with a custom metric.
- `detailed_analysis.rs`: Analyzing matches with per-metric score details.
- `multi_matcher.rs`: Combining multiple matchers with `MultiMatcher`.

Run an example using:
```bash
cargo run --example basic_string_matching
```

Each example includes detailed comments and instructions. The `examples/common.rs` file provides shared metrics used across these demos.

## Configuration

Customize Matchete's behavior with:
- **Thresholds**: Set minimum scores for matches (default: 0.4).
- **Weights**: Assign importance to each metric.
- **Options**: Configure settings like case sensitivity via key-value pairs.
- **Conditional Thresholds**: Apply dynamic thresholds based on query properties.
- **Metric Groups**: Organize metrics for advanced strategies like fallback chains.

See `multiple_metrics.rs` for an example of complex configurations.

## Contributing

Contributions are welcome! To contribute:
1. Fork the repository.
2. Create a branch for your feature or fix (`git checkout -b feature/my-feature`).
3. Commit your changes (`git commit -m "Add my feature"`).
4. Push to your branch (`git push origin feature/my-feature`).
5. Open a pull request with a clear description.

Please include tests and update documentation. Adhere to the [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct).

## License

Matchete is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.

## Contact

For questions, suggestions, or issues, visit the [GitHub repository](https://github.com/liagha/matchete).