nostrdb/search: phrase searching working
This changes the search algorithm to be much smarter and more efficient at searching phrases. It is also much simpler, using less intermediate data structures. Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -163,6 +163,30 @@ struct ndb_keypair {
|
||||
unsigned char pair[96];
|
||||
};
|
||||
|
||||
#define MAX_TEXT_SEARCH_RESULTS 128
|
||||
#define MAX_TEXT_SEARCH_WORDS 8
|
||||
|
||||
// unpacked form of the actual lmdb fulltext search key
|
||||
// see `ndb_make_text_search_key` for how the packed version is constructed
|
||||
struct ndb_text_search_key
|
||||
{
|
||||
int str_len;
|
||||
const char *str;
|
||||
uint64_t timestamp;
|
||||
uint64_t note_id;
|
||||
int word_index;
|
||||
};
|
||||
|
||||
struct ndb_text_search_result {
|
||||
struct ndb_text_search_key key;
|
||||
int prefix_chars;
|
||||
};
|
||||
|
||||
struct ndb_text_search_results {
|
||||
struct ndb_text_search_result results[MAX_TEXT_SEARCH_RESULTS];
|
||||
int num_results;
|
||||
};
|
||||
|
||||
// these must be byte-aligned, they are directly accessing the serialized data
|
||||
// representation
|
||||
#pragma pack(push, 1)
|
||||
@@ -271,25 +295,6 @@ struct ndb_filter {
|
||||
struct ndb_filter_elements *elements[NDB_NUM_FILTERS];
|
||||
};
|
||||
|
||||
// unpacked form of the actual lmdb fulltext search key
|
||||
// see `ndb_make_text_search_key` for how the packed version is constructed
|
||||
struct ndb_text_search_key
|
||||
{
|
||||
int str_len;
|
||||
const char *str;
|
||||
int word_index;
|
||||
uint64_t timestamp;
|
||||
};
|
||||
|
||||
// contains note ids of the searched notes from ndb_text_search
|
||||
struct ndb_text_search_results {
|
||||
uint64_t phrase_results[32];
|
||||
int num_phrase_results;
|
||||
|
||||
uint64_t other_results[32];
|
||||
int num_other_results;
|
||||
};
|
||||
|
||||
|
||||
// HELPERS
|
||||
int ndb_calculate_id(struct ndb_note *note, unsigned char *buf, int buflen);
|
||||
|
||||
Reference in New Issue
Block a user