2018-12-30 13:04:02 +01:00
|
|
|
#![cfg_attr(feature = "nightly", feature(test))]
|
|
|
|
|
2018-11-27 19:11:33 +01:00
|
|
|
pub mod automaton;
|
2018-12-02 16:45:17 +01:00
|
|
|
pub mod database;
|
2018-11-08 12:05:59 +01:00
|
|
|
pub mod data;
|
2018-05-27 15:23:43 +02:00
|
|
|
pub mod rank;
|
2018-09-27 16:32:17 +02:00
|
|
|
pub mod tokenizer;
|
2018-10-09 18:23:35 +02:00
|
|
|
mod common_words;
|
2019-02-17 16:32:43 +01:00
|
|
|
mod shared_data_cursor;
|
|
|
|
mod write_to_bytes;
|
2018-07-10 21:29:17 +02:00
|
|
|
|
2019-02-08 15:17:42 +01:00
|
|
|
use serde_derive::{Serialize, Deserialize};
|
|
|
|
|
2018-12-13 11:52:34 +01:00
|
|
|
pub use rocksdb;
|
|
|
|
|
2018-09-27 16:59:41 +02:00
|
|
|
pub use self::tokenizer::Tokenizer;
|
2018-10-09 18:23:35 +02:00
|
|
|
pub use self::common_words::CommonWords;
|
2018-05-13 15:12:15 +02:00
|
|
|
|
2018-12-22 12:00:24 +01:00
|
|
|
/// Represent an internally generated document unique identifier.
|
|
|
|
///
|
|
|
|
/// It is used to inform the database the document you want to deserialize.
|
|
|
|
/// Helpful for custom ranking.
|
2019-02-08 15:17:42 +01:00
|
|
|
#[derive(Serialize, Deserialize)]
|
2018-12-22 12:00:24 +01:00
|
|
|
#[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]
|
2018-12-25 12:26:38 +01:00
|
|
|
pub struct DocumentId(u64);
|
2018-05-27 15:23:43 +02:00
|
|
|
|
2018-05-27 11:15:05 +02:00
|
|
|
/// This structure represent the position of a word
|
|
|
|
/// in a document and its attributes.
|
|
|
|
///
|
|
|
|
/// This is stored in the map, generated at index time,
|
|
|
|
/// extracted and interpreted at search time.
|
2018-12-23 16:46:49 +01:00
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
2018-07-10 21:29:17 +02:00
|
|
|
#[repr(C)]
|
2018-05-27 11:15:05 +02:00
|
|
|
pub struct DocIndex {
|
|
|
|
/// The document identifier where the word was found.
|
2018-10-17 13:35:34 +02:00
|
|
|
pub document_id: DocumentId,
|
2018-05-27 11:15:05 +02:00
|
|
|
|
2018-12-23 16:46:49 +01:00
|
|
|
/// The attribute in the document where the word was found
|
|
|
|
/// along with the index in it.
|
2019-02-02 14:17:50 +01:00
|
|
|
pub attribute: u16,
|
|
|
|
pub word_index: u32,
|
2018-05-27 11:15:05 +02:00
|
|
|
|
2018-12-23 16:46:49 +01:00
|
|
|
/// The position in bytes where the word was found
|
|
|
|
/// along with the length of it.
|
2018-05-27 11:15:05 +02:00
|
|
|
///
|
2018-12-23 16:46:49 +01:00
|
|
|
/// It informs on the original word area in the text indexed
|
|
|
|
/// without needing to run the tokenizer again.
|
2019-02-02 14:17:50 +01:00
|
|
|
pub char_index: u32,
|
|
|
|
pub char_length: u16,
|
2018-05-13 15:12:15 +02:00
|
|
|
}
|
|
|
|
|
2018-05-27 11:15:05 +02:00
|
|
|
/// This structure represent a matching word with informations
|
|
|
|
/// on the location of the word in the document.
|
|
|
|
///
|
|
|
|
/// The order of the field is important because it defines
|
|
|
|
/// the way these structures are ordered between themselves.
|
|
|
|
///
|
|
|
|
/// The word in itself is not important.
|
2018-05-27 15:23:43 +02:00
|
|
|
// TODO do data oriented programming ? very arrays ?
|
2018-12-23 16:46:49 +01:00
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
2018-05-27 11:15:05 +02:00
|
|
|
pub struct Match {
|
2018-05-27 15:23:43 +02:00
|
|
|
/// The word index in the query sentence.
|
|
|
|
/// Same as the `attribute_index` but for the query words.
|
|
|
|
///
|
|
|
|
/// Used to retrieve the automaton that match this word.
|
|
|
|
pub query_index: u32,
|
|
|
|
|
2018-05-27 11:15:05 +02:00
|
|
|
/// The distance the word has with the query word
|
|
|
|
/// (i.e. the Levenshtein distance).
|
|
|
|
pub distance: u8,
|
|
|
|
|
2018-12-23 16:46:49 +01:00
|
|
|
/// The attribute in the document where the word was found
|
|
|
|
/// along with the index in it.
|
2019-02-02 14:17:50 +01:00
|
|
|
pub attribute: u16,
|
|
|
|
pub word_index: u32,
|
2018-07-06 20:58:06 +02:00
|
|
|
|
|
|
|
/// Whether the word that match is an exact match or a prefix.
|
|
|
|
pub is_exact: bool,
|
2018-12-23 16:46:49 +01:00
|
|
|
|
|
|
|
/// The position in bytes where the word was found
|
|
|
|
/// along with the length of it.
|
|
|
|
///
|
|
|
|
/// It informs on the original word area in the text indexed
|
|
|
|
/// without needing to run the tokenizer again.
|
2019-02-02 14:17:50 +01:00
|
|
|
pub char_index: u32,
|
|
|
|
pub char_length: u16,
|
2018-05-13 15:12:15 +02:00
|
|
|
}
|
2018-05-27 15:23:43 +02:00
|
|
|
|
|
|
|
impl Match {
|
|
|
|
pub fn zero() -> Self {
|
|
|
|
Match {
|
|
|
|
query_index: 0,
|
|
|
|
distance: 0,
|
2019-02-02 14:17:50 +01:00
|
|
|
attribute: 0,
|
|
|
|
word_index: 0,
|
2018-07-06 20:58:06 +02:00
|
|
|
is_exact: false,
|
2019-02-02 14:17:50 +01:00
|
|
|
char_index: 0,
|
|
|
|
char_length: 0,
|
2018-05-27 15:23:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn max() -> Self {
|
|
|
|
Match {
|
|
|
|
query_index: u32::max_value(),
|
|
|
|
distance: u8::max_value(),
|
2019-02-02 14:17:50 +01:00
|
|
|
attribute: u16::max_value(),
|
|
|
|
word_index: u32::max_value(),
|
2018-07-06 20:58:06 +02:00
|
|
|
is_exact: true,
|
2019-02-02 14:17:50 +01:00
|
|
|
char_index: u32::max_value(),
|
|
|
|
char_length: u16::max_value(),
|
2018-12-23 16:46:49 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
use std::mem;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn docindex_mem_size() {
|
2019-02-02 14:17:50 +01:00
|
|
|
assert_eq!(mem::size_of::<DocIndex>(), 24);
|
2018-12-23 16:46:49 +01:00
|
|
|
}
|
2018-05-27 15:23:43 +02:00
|
|
|
}
|