![Maven Central Adds Sigstore Signature Validation](https://cdn.sanity.io/images/cgdhsj6q/production/7da3bc8a946cfb5df15d7fcf49767faedc72b483-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Maven Central Adds Sigstore Signature Validation
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
feathers-solr
Advanced tools
A Feathers Solr Adapter. Require >= Solr 5.x.
See this adapter in action
$ npm install feathers-solr --save
Important:
feathers-solr
implements the Feathers Common database adapter API and querying syntax.
Install a supported HTTP Client Fetch, Undici or use a different HTTP Client.
$ npm install node-fetch --save
service([options])
Returns a new service instance initialized with the given options.
const service = require('feathers-solr');
app.use('/gettingstarted', service({ id, Model, events, paginate }));
Options:
Model
(required) - HTTP Client (fetch, undici, or your custom).name
- The name of the Solr Core / Colelction.defaultParams
- This params added to all Solr request.id
(optional, default: 'id'
) - The name of the id field property.commitStrategy
- (optional, default: { softCommit: true, commitWithin: 10000, overwrite: true }
) - Define how Index changes are stored Solr Commits.defaultSearch
- (optional, default: { defType: 'edismax', qf: 'name^10 age^1 gender' }
) - Search strategy if query contains the param $search
The Extended DisMax Query Parser.suggestHandler
- (optional, default: suggest
) - Request a Solr Suggest Handler instead reggular a search if query contains the param $suggest
Suggester.events
(optional) - A list of custom service events sent by this servicepaginate
(optional) - A pagination object containing a default
and max
page sizewhitelist
(default: ['$search', '$params', '$facet', '$filter']
) [optional] - The list of additional non-standard query parameters to allow, by default populated with all Solr specific ones. You can override, for example in order to restrict access to some queries (see the options documentation).multi
(optional) - Allow create
with arrays and update
and remove
with id
null
to change multiple items. Can be true
for all methods or an array of allowed methods (e.g. [ 'remove', 'create' ]
)The following example will create a Service with the name and endpoint solr
.
const feathers = require('@feathersjs/feathers');
const express = require('@feathersjs/express');
const fetch = require('node-fetch');
const undici = require('undici');
const Service = require('feathers-solr');
const { SolrClient } = require('feathers-solr');
const solrServer = 'http://localhost:8983/solr/gettingstarted';
// Create an Express compatible Feathers application instance.
const app = express(feathers());
// Turn on JSON parser for REST services
app.use(express.json());
// Turn on URL-encoded parser for REST services
app.use(express.urlencoded({ extended: true }));
// Enable REST services
app.configure(express.rest());
// Enable REST services
// init Adapter witch Fetch or Undici
const options = {
Model: SolrClient(fetch, solrServer),
paginate: {},
events: ['testing']
};
app.use('gettingstarted', new Service(options));
app.listen(3030, () => {
console.log(`Feathers server listening on port http://127.0.0.1:3030`);
});
Install Solr
bin/solr start -e gettingstarted
Use feathers-solr/bin/install-solr.sh
for a kickstart installation.
Run the example with node app
and go to localhost:3030/gettingstarted.
Feathers Docs Database Querying
This Adapter use the Solr JSON Request API.
The following params passed in raw to Solr. This gives the full access to the Solr JSON Request API.
To avoid full query (read) access, just whitelist only $search
and add your query startegy into a Hook.
An alias to Solr param query
(string) - Solr Schemaless Mode
query: {
$search: 'John';
}
The Standard Query Parser - Some Search Examples:
{ $search: "John" }
{ $search: "John~" }
{ $search: "John Doe" }
{ $search: "Jo*" }
{ $search: "*n" }
{ $search: "(John AND Doe)" }
{ $search: "(John OR Doe)" }
service.options.defaultSearch = {
defType: 'edismax',
qf: 'name^10 age^1 gender'
};
const response = await service.find({
query: {
$search: 'Doug 20 male'
}
});
See
$parmas
example how query advanced search
A alias to Solr param facet
query: {
$facet: {
age_min : "min(age)",
age_max : "max(age)",
age_ranges: {
type: "range",
field: "age",
start: 0,
end: 100,
gap: 10
}
}
}
The response should look like this:
{
QTime: 0,
total: 50,
limit: 10,
skip: 0,
data: [...],
facet: {
age_min: 1,
age_max: 104,
count: 54,
age_ranges: {
buckets: [{
val: 0,
count: 4
}, {
val: 25,
count: 17
}, {
val: 50,
count: 15
}, {
val: 75,
count: 14
}]
}
}
}
query:{
$search:'blue',
'{!tag=COLOR}color':'Blue',
$facet:{
sizes:{type:terms, field:size},
colors:{type:terms, field:color, domain:{excludeTags:COLOR} },
brands:{type:terms, field:brand, domain:{excludeTags:BRAND}
}
}
An alias to Solr param params
. Allows you to access all solr query (read) features like:
const response = await service.find({
query: {
$search: 'John !Doe +age:[80 TO *]',
$params: {
'defType': 'edismax',
'qf': 'name^10 city^5 age',
'mm': '2<99% 7<80% 10<50%',
'q.op': 'OR',
'sow': true,
'spellcheck': true,
'spellcheck.accuracy': 0.7,
'spellcheck.extendedResults': true,
'spellcheck.collate': true,
'spellcheck.count': 10,
'spellcheck.maxCollations': 1,
'spellcheck.maxCollationTries': 10,
'spellcheck.collateExtendedResults': true,
'spellcheck.onlyMorePopular': true,
'spellcheck.dictionary': 'LANG_X_text_spell_token'
}
}
});
const response = await service.find({
query: {
$suggest: 'john'
}
});
const response = await service.find({
query: {
$params: {
'group': true,
'group.field': 'gender',
'group.format': 'simple'
}
}
});
const response = await service.find({
query: {
$search: 'doug',
$params: {
'hl': true,
'hl.field': 'name'
}
},
paginate: { max: 10, default: 3 }
});
const response = await service.find({
query: {
$search: 'male',
$params: {
'mlt': true,
'mlt.fl': 'gender'
}
},
paginate: { max: 10, default: 3 }
});
const response = await service.find({
query: {
$select: ['*', 'score', '_dist_:geodist()'],
$params: {
'sfield': 'location_p',
'pt': '40.649558, -73.991815',
d: 50,
distanceUnits: 'kilometers',
sort: 'geodist() asc'
}
},
paginate: { max: 10, default: 3 }
});
An alias to Solr filter
passed in raw. It's recomanded to go with the common Querying.
See more query variants JSON Facet API,Solr Facet Functions and Analytics, Solr Subfacets, Multi-Select Faceting
All service methods provide the multi
options.
The options.commitStrategy.override
is true in default. This allow to override an existing id
by service.create
.
Add the field _version_
to the $select
params will return the document content with it's version. Create with an existing id
and _version_
for optimistic concurrency
Will overide the complete Document. If the _version_
field is part of update content, it will be removed.
Use the Solr Updating Parts of Documents
Simple usage
service.patch(id, {age: 30});
Atomic Updates - Increment field age + 1
service.patch(id, {age: {inc:1}});
All Solr methods provided:
set
- Set or replace the field value(s) with the specified value(s), or remove the values if 'null' or empty list is specified as the new value. May be specified as a single value, or as a list for multiValued fields.add
- Adds the specified values to a multiValued field. May be specified as a single value, or as a list.add-distinct
- Adds the specified values to a multiValued field, only if not already present. May be specified as a single value, or as a list.remove
- Removes (all occurrences of) the specified values from a multiValued field. May be specified as a single value, or as a list.removeregex
- Removes all occurrences of the specified regex from a multiValued field. May be specified as a single value, or as a list.inc
- Increments a numeric value by a specific amount. Must be specified as a single numeric value.Provide delete by id
ans query
Delete all documents at once:
service.remove(null, {query: {id:'*'}});
Most of the data mutating operations in Solr (create, update, remove) do not return the full resulting document, therefore I had to resolve to using get as well in order to return complete data. This solution is of course adding a bit of an overhead, although it is also compliant with the standard behaviour expected of a feathers database adapter.
Use Raw Query
service.Model.post('update/json', data)
to avoid this overhead. The response is native Solr.
You can access all Solr API endpoints by using a direct model usage.
Ping the Solr core/collection:
service.Model.get('admin/ping');
Get Solr schema information:
service.Model.get('schema');
Modify Solr schema:
service.Model.post('schema',{"add-field":{name:"age",type:"pint"}});
Get Solr config information:
service.Model.get('config');
Modify Solr config:
service.Model.post('config',{"add-requesthandler":{...}});
This Adapter offers a node-fetch
interface for a maximum on HTTP Client comfort and undici
for maximum (100% compared to node-fetch) in performance.
If you like to go with your favorite one:
class CustomClient {
constructor(HTTPModule, conn) {}
get(api, params = {}) {}
post(api, data, params = {}) {}
};
const options = {
Model: CustomClient(HTTPModule, solrServer),
paginate: {},
events: ['testing']
};
app.service('solr', new Service(options))
If you find a bug or something to improve i will be happy to see your PR!
When adding a new feature, please make sure you write tests for it with decent coverage as well.
2.3.0
2.2.0
Copyright (c) 2015
Licensed under the MIT license.
FAQs
A Feathers service adapter for Solr
The npm package feathers-solr receives a total of 2,326 weekly downloads. As such, feathers-solr popularity was classified as popular.
We found that feathers-solr demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.