#query-builder #lucene #proc-macro #struct #struct-fields

lucene_query_builder

A procmacro derive crate to generate lucene query builder for Rust structs :

8 releases

0.4.0 Dec 19, 2025
0.3.1 Dec 12, 2025
0.3.0 Jul 14, 2021
0.2.4 Mar 11, 2021
0.1.0 Dec 12, 2019

#316 in Rust patterns

Download history 412/week @ 2025-10-21 480/week @ 2025-10-28 383/week @ 2025-11-04 354/week @ 2025-11-11 417/week @ 2025-11-18 366/week @ 2025-11-25 589/week @ 2025-12-02 657/week @ 2025-12-09 414/week @ 2025-12-16 565/week @ 2025-12-23 740/week @ 2025-12-30 385/week @ 2026-01-06 584/week @ 2026-01-13 446/week @ 2026-01-20 473/week @ 2026-01-27 562/week @ 2026-02-03

2,154 downloads per month
Used in 8 crates (3 directly)

MIT license

6KB
50 lines

Lucene Query Builder Derive

A procmacro derive crate to generate lucene query builder for Rust structs :

Usage :

use lucene_query_builder::QueryBuilder;

#[derive(QueryBuilder)]
struct Person {
    name: String,
    age: i32,
}

Simple query

let query = Person::query_builder()
    .name("Bob")
    .or()
    .name("Alice")
    .build();

assert_eq!(query, "name:Bob OR name:Alice".to_string());

Nested query

let query = Person::query_builder()
    .expr(Person::query_builder().name("Bob").or().name("Alice"))
    .and()
    .age("22")
    .build();

assert_eq!(
    query,
    "(name:Bob OR name:Alice) AND age:22".to_string()
);

Range query

let query = Person::query_builder().age_range("7", "77").build();

assert_eq!(query, "age:[7 TO 77]".to_string());

Rename builder functions and field names

Use #[query_builder_rename = "name"] if you need to rename the generated method :

#[derive(QueryBuilder)]
struct Person {
    name: String,
    age: i32,
    #[query_builder_rename = "fullname"]
    complete_name: String,
}
let query = Person::query_builder()
    .name("Bob")
    .and()
    .fullname("Bob Marley")
    .build();

assert_eq!(
    query,
    "name:Bob AND complete_name:\"Bob Marley\"".to_string()
);

If you need to rename the generated lucene field you can use #[query_builder_field = "name"].

#[derive(QueryBuilder)]
struct Person {
    name: String,
    age: i32,
    #[query_builder_rename = "fullname"]
    #[query_builder_field = "fullname"]
    complete_name: String,
}
let query = Person::query_builder()
    .name("Bob")
    .and()
    .fullname("Bob Marley")
    .build();

assert_eq!(
    query,
    "name:Bob AND fullname:\"Bob Marley\"".to_string()
);

Ignore fields

If you need to ignore a field use the attribute macro : #[query_builder_ignore]

Dependencies

~1.5MB
~39K SLoC