krisk / Fuse

Lightweight fuzzy-search, in JavaScript
https://fusejs.io/
Apache License 2.0
18.44k stars 774 forks source link

Support escaping the OR operator (`|`) when extended search is enabled #765

Closed smithki closed 2 months ago

smithki commented 7 months ago

Is there an existing issue or pull request for this?

Feature description

Extended search is a critical piece of Fuse.js, but it has some limitations when searching fields that contain pipe characters (|). If we could escape the OR operator, this could be worked around for a case like this:

const myData = [
  { example: "for | some | reason | there's | pipes | in | this | string" },
];

const fuse = new Fuse(myData, {
  keys: ["example"],
  useExtendedSearch: true,
});

fuse.search({
  example: `some \\| reason`, // fuzzy match includes pipe character
});

fuse.search({
  example: `^"for \\| some" "this \\| string"$`, // match prefix AND suffix including pipe characters
});

fuse.search({
  example: `^"for \\| some" | "this \\| string"$`, // match prefix OR suffix including pipe characters
});

Desired solution

Easy: support escaping pipe operators present in extended search queries using backslashes (i.e. \\|)

Alternatives considered

I don't see an alternative to achieve this with Fuse at the moment. For my use-case, this complicates things when queries need to mix exact matches for some fields with fuzzy matches for others.

Additional context

No response

github-actions[bot] commented 3 months ago

This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 30 days