Search document collections with GroupDocs.Search
Leave feedback
On this page
GroupDocs.Search is the one API in the suite that works on a collection rather than a single file. You build an index over a folder of documents once, then query it as often as you like — the index does the reading, so queries stay fast no matter how large the corpus grows.
That makes it a two-phase API: index, then search. The entry point is Index, not a “searcher”.
Note
The code on this page is complete and ready to run against GroupDocs.Total for Node.js via Java. Downloadable output samples for these examples are being added — in the meantime, the GroupDocs.Search for Node.js via Java documentation carries the full set of runnable examples.
Build an index and search it
The index lives in a folder of its own, separate from the documents. add reads a folder of documents into it; search queries what has been indexed.
import{Index}from'@groupdocs/groupdocs.total';import{basename}from'path';// The index is a folder the library owns; keep it out of your documents folder
constindex=newIndex('search-build-index/index');// Index every supported document in the folder
index.add('archive');constresult=index.search('throughput');console.log('Documents found: '+result.getDocumentCount());console.log('Total occurrences: '+result.getOccurrenceCount());for(leti=0;i<result.getDocumentCount();i++){constdocument=result.getFoundDocument(i);// getFilePath() is absolute; the file name is the useful part here
constfileName=basename(document.getDocumentInfo().getFilePath());console.log(' '+fileName+' ('+document.getOccurrenceCount()+' occurrences)');}index.close();
Exact matching fails on scanned documents and typos. Fuzzy search accepts a similarity level — how many character edits away a word may be and still count as a hit.
import{Index}from'@groupdocs/groupdocs.total';importjavafrom'java';constSearchOptions=java.import('com.groupdocs.search.options.SearchOptions');constTableDiscreteFunction=java.import('com.groupdocs.search.options.TableDiscreteFunction');constindex=newIndex('search-fuzzy/index');index.add('archive');constoptions=newSearchOptions();options.getFuzzySearch().setEnabled(true);options.getFuzzySearch().setFuzzyAlgorithm(newTableDiscreteFunction(3));// Matches "throughput" even when spelled "througput" or "throughtput"
constresult=index.search('throughput',options);console.log('Documents found: '+result.getDocumentCount());console.log('Total occurrences: '+result.getOccurrenceCount());index.close();
Query text supports AND, OR and NOT, so you can express the same conditions a user would type into a search box. All three archived documents mention throughput; only the phase-two proposal mentions a forecast, so this query returns the other two.
import{Index}from'@groupdocs/groupdocs.total';import{basename}from'path';constindex=newIndex('search-boolean/index');index.add('archive');constresult=index.search('throughput AND NOT forecast');console.log('Documents found: '+result.getDocumentCount());for(leti=0;i<result.getDocumentCount();i++){constdocument=result.getFoundDocument(i);console.log(' '+basename(document.getDocumentInfo().getFilePath()));}index.close();
An index is durable. Point Index at an existing index folder and it reopens what is already there rather than rebuilding — call add again only when documents change, and update to refresh ones that were modified.
Learn more
GroupDocs.Search also offers phrase, wildcard, regex, faceted and date-range queries, highlights matches in the source document, indexes asynchronously with progress events, runs OCR over scanned pages, supports synonyms, homophones and stop words, and can distribute an index across a search network.