Este es un complemento de Flutter de búsqueda de texto completo que se desarrolla en Tantivy.
Tantivy es una biblioteca de motores de búsqueda de texto completo inspirada en Apache Lucene y escrita en Rust.
El esquema describe el tipo (cadena, texto, u64) de un campo, así como cómo debe manejarse.
Tipo de campo de esquema compatible:
| Tipo de campo | Descripción |
|---|---|
| cadena | Configuración de tipo de campo de cadena |
| texto | Configuración de tipo de campo de texto |
| U64 | Configuración de tipo de campo de Integers Unsigned 64 bits de 64 bits |
| i64 | Integers de 64 bits 64 Configuración de tipo de campo |
| f64 | 64 bits flotación 64 configuración de tipo de campo |
| fecha | Configuración de tipo de campo de fecha de 64 bits de 64 bits |
| faceta | Faceta hieráctica |
| bytes | Bytes (uno por documento) |
A los operadores como y , o , deben estar en mayúsculas
Términos simples : "Por ejemplo: Barack Obama se tokenizan simplemente utilizando el SimpleTokenizer de Tantivy, por lo tanto, convirtiéndose [" Barack "," Obama "]. Los términos se buscan dentro de los términos predeterminados del analizador de consultas.
Por ejemplo, si el cuerpo y el título son campos predeterminados, nuestros términos de ejemplo son ["Título: Barack", "Body: Barack", "Título: Obama", "Body: Obama"]. Por defecto, todos los campos tokenizados e indexados son campos predeterminados.
Múltiples términos se manejan como un OR: cualquier documento que contenga al menos uno de los términos pasará por la puntuación.
Este comportamiento es más lento, pero no es una mala idea si el usuario está clasificando por relevancia: el usuario generalmente solo escanea a través de los primeros documentos en orden de disminución de la relevancia y se detendrá cuando los documentos ya no son relevantes.
Operadores booleanos : y, o. Y tiene prioridad o, para que A y B o C se interpreten como (A y B) o C.
Además de los operadores booleanos , el -, + puede ayudar a definir. Estos operadores son suficientes para expresar todas las consultas utilizando operadores booleanos. Por ejemplo, se puede escribir x e y o z (( +x +y) z). Además, estos operadores pueden ayudar a definir consultas "opcionales requeridas". (+xy) coincide con el mismo documento establecido como simplemente x, pero Y ayudará a refinar el puntaje.
Términos negativos : al preparar un término por A -, se puede excluir un término de la búsqueda. Esto es útil para desambiguar una consulta. por ejemplo, la fruta de manzana
Debe términos : al prepetar un término por A +, se puede requerir un término para la búsqueda.
Términos de frase : los términos citados se convierten en búsquedas de frases en campos que tienen posiciones indexadas. Por ejemplo, título: "Barack Obama" solo encontrará documentos que tienen "Barack" seguido inmediatamente por "Obama".
Términos de rango : las búsquedas de rango se pueden realizar especificando el límite de inicio y finalización. Estos pueden ser inclusivos o exclusivos. Por ejemplo, Título: [A a C} encontrará todos los documentos cuyo título contiene una palabra lexicográficamente entre A y C (límite inferior inclusivo, límite superior exclusivo). Los límites inclusivos son [], exclusivos son {}.
Valores de fecha : el analizador de consultas admite fechas formateadas RFC3339. Por ejemplo, "2002-10-02T15: 00: 00.05Z"
Todos los documentos consultan : un simple * coincidirá con todos los documentos en el índice.
/// create a instance of SearchEngine and set it up
final engine = SearchEngine ();
SearchEngine . setup ();
/// get the path which used to store index files
final _path = await getApplicationDocumentsDirectory ().path;
/// define the schema of the data which wanted to be indexed
final _schema = r'{"id": "i64", "timestamp": "date", "content": "text"}' ;
/// open a exists one or create a new one on the device
engine. openOrCreate (_path, _schema);
/// encode the data object to a json string
final _doc = jsonEncode (dataObject);
/// start to index and store the data
await engine. index (_doc);
/// give the query keywords and the field which to search on
final res = await engine. search ( '关键字 关键词' , [ 'content' ], 1 , 10 );
/// remove a specify document by giving a field of u64 and it's value
/// document can't be deleted by text field, please use string field
await engine. deleteByU64 ( 'id' , 141906710246850560 );
