ducene 0.0.7 ducene: ^0.0.7 copied to clipboard
An instant search library for Dart.
ducene #
An instant search library for Dart.
Demo #
Usage #
A simple usage example:
import 'package:ducene/ducene.dart';
Analyzer st = new StandardAnalyzer();
// Store the index in memory:
IndexDirectory directory = new RAMIndexDirectory();
// To store an index on disk, use this instead:
//IndexDirectory directory = new FSIndexDirectory(new Directory("testindex"));
IndexWriter writer = new IndexWriter(directory);
String text = 'This is the text of #1.';
Document doc1 = new Document()
.append('id', '1')
.append('text', text, analyzer: st)
.append('filter', 'x')
.append('cat', 'CAT-A')
.append('subcat', 'CAT-A-1')
.append('price', '80');
text = 'This is the text of #2.';
Document doc2 = new Document()
.append('id', '2')
.append('text', text, analyzer: st)
.append('filter', 'x')
.append('cat', ['CAT-B', 'CAT-A'])
.append('subcat', 'CAT-A-2')
.append('price', '70');
text = "the text which 'or' matched";
Document doc3 = new Document()
.append('id', '3')
.append('text', text, analyzer: st)
.append('filter', 'x')
.append('cat', 'CAT-C')
.append('subcat', 'CAT-C-1')
.append('price', '100');
writer.write([doc1, doc2, doc3]);
// Now search the index:
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
BoolQuery query = new BoolQuery(Op.or)
.append('text', 'this text', analyzer: st)
.addFilter(new TermQuery(new Term('filter', 'x')));
TopDocs hits = searcher.search(query, 1000, new MatchScoreSort(query));
assert(3 == searcher.count(query));
assert(3 == hits.totalHits);
// Iterate through the results:
for (ScoreDoc hit in hits.scoreDocs) {
Document hitDoc = searcher.doc(hit.doc);
assert(hitDoc.get('text').contains('the text'));
print('${hitDoc.get('id')} : ${hit.score.toString()}');
// Highlight:
String snippet
= FieldHighlight.getSnippet(query, 'text', hitDoc.get('text'));
assert(snippet.contains('<b>'));
print(snippet);
}
// Facet + Stats:
Map<String,Set<int>> mainFacet = FieldFacet.getCount(hits.docSet,'cat',reader);
Set<int> mainFacet_A = mainFacet['CAT-A'];
assert (mainFacet_A.length == 2);
Set<int> mainFacet_B = mainFacet['CAT-B'];
assert (mainFacet_B.length == 1);
Set<int> mainFacet_C = mainFacet['CAT-C'];
assert (mainFacet_C.length == 1);
var mainStats_A = FieldStats.getStats(mainFacet_A, 'price', reader);
assert(mainStats_A['sum'] == 150 && mainStats_A['mean'] == 75);
var mainStats_B = FieldStats.getStats(mainFacet_B, 'price', reader);
assert(mainStats_B['count'] == 1);
var mainStats_C = FieldStats.getStats(mainFacet_C, 'price', reader);
assert(mainStats_C['min'] == 100 && mainStats_C['max'] == 100);
var subFacet_A = FieldFacet.getCount(mainFacet_A, 'subcat', reader);
Set<int> subFacet_A_1 = subFacet_A['CAT-A-1'];
assert (subFacet_A_1.length == 1);
Set<int> subFacet_A_2 = subFacet_A['CAT-A-2'];
assert (subFacet_A_2.length == 1);
var subStats_A_1 = FieldStats.getStats(subFacet_A_1, 'price', reader);
assert(subStats_A_1['sum'] == 80);
var subStats_A_2 = FieldStats.getStats(subFacet_A_2, 'price', reader);
assert(subStats_A_2['sum'] == 70);
Features and bugs #
Please file feature requests and bugs at the issue tracker.