comigor/fuzzy

Score not showing properly

Opened this issue · 2 comments

First of all, amazing library. But, I guess the score property of result object is always zero (even when it hasn't found any matches).

Example:

void testFuzzy() {
    final fuse = Fuzzy(
      [
        Person('John', 'Doe', 29),
        Person('Jane', 'Doe', 32),
        Person('Peter', 'Parker', 36),
        Person('Bruce', 'Wayne', 30),
        Person('Clark', 'Kent', 50),
        Person('Tony', 'Stark', 34),
        Person('Clint', 'Barton', 35),
      ],
      options: FuzzyOptions(
        keys: [WeightedKey<Person>(name: 'firstname', getter: (p) => p.firstname, weight: 1)],
        shouldNormalize: true,
        isCaseSensitive: false,
        shouldSort: false,
        findAllMatches: false,
        verbose: true,
      ),
    );

    var result = fuse.search('John');

    if (result.isNotEmpty) {
      result
          .forEach((r) => print('${r.item.firstname} ${r.item.surname} (${r.item.age}) | score: ${r.score}'));
    } else {
      print('no results');
    }
  }


class Person {
  final String firstname;
  final String surname;
  final int age;

  Person(this.firstname, this.surname, this.age);
}

output shows:

flutter: Full text: "John", score: 0.0
flutter: Score average (final): 0.0
flutter:
Check Matches: true
flutter: Full text: "Jane", score: 0.5
flutter: Score average (final): 0.5
flutter:
Check Matches: true
flutter: Full text: "Peter", score: 1.0
flutter: Score average (final): 1.0
flutter:
Check Matches: true
flutter: Full text: "Bruce", score: 1.0
flutter: Score average (final): 1.0
flutter:
Check Matches: true
flutter: Full text: "Clark", score: 1.0
flutter: Score average (final): 1.0
flutter:
Check Matches: true
flutter: Full text: "Tony", score: 0.5
flutter: Score average (final): 0.5
flutter:
Check Matches: true
flutter: Full text: "Clint", score: 1.0
flutter: Score average (final): 1.0
flutter:
Check Matches: true
flutter:
Computing score:
flutter: John Doe (29) | score: 0.0
flutter: Jane Doe (32) | score: 0.0
flutter: Tony Stark (34) | score: 0.0

We can see that on verbose output the score is taken correctly, but when printing after search, is aways zero.

I can workaround it doing:

    result.forEach((r) => r.score = r.matches[0].score);
    result.sort((a,b) => a.score.compareTo(b.score));

But I'm not happy with this approach, is there a solution for this? Or perhaps I'm doing something wrong, please help.
Thanks in advance

I forgot to mention that results are not sorted by score as well (even with shouldSort: true), due to the same problem, score always equal to zero, so sorting will not take effect.

Hello @blinkn! Sorry for taking a long time to answer this.

This library was a hacky implementation of Fuse.js in Dart and those sort of errors could definitely occur, sorry about that.

I'm not sure that I'll be able to take a look at this soon, but if you could, please update us in the process, and open a PR here so other could benefit from it as well!