krisk / Fuse

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

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

Open smithki opened 2 months ago

smithki commented 2 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