flutter Isar:有没有一种方法可以使用索引对IsarLinks对象的项进行文本搜索?

ac1kyiln  于 2023-06-24  发布在  Flutter
关注(0)|答案(1)|浏览(260)

bounty还有3天到期。回答此问题可获得+100声望奖励。Captain Hatteras希望引起更多关注这个问题。

我有一个Bar的集合,每个集合都有到Foo的isar链接:

@collection
class Bar{
  Id? id;
  
  final foos = IsarLinks<Foo>();
  ... // Bar stuff
};

每个Foo对象都有一个名为text的字段,它是一个String

@collection
class Foo{
  Id? id;
  
  late String text;
  ... // Foo stuff
};

现在,我想做的是搜索并找到所有链接到特定BarFoo,这些Foo在其text中包含所有给定的关键字(最好不区分大小写)。因此,使用关键字“canada”和“street”进行搜索时,Foo应该与text = "I don't know what street, Canada is on. - Al Capone匹配
Isar有一个关于如何进行全文搜索的指南。在其中,他们建议添加搜索文本的单词索引,如下所示:

@collection
class Foo{
  Id? id;
  
  late String text;
  
  @Index(type: IndexType.value, caseSensitive: false) // for more flexibility; see https://isar.dev/recipes/full_text_search.html#i-want-more-control
  List<String> get words => Isar.splitWords(text); // see https://isar.dev/recipes/full_text_search.html#splitting-text-the-right-way
};

但是,似乎没有一种简单的方法来基于IsarLinks索引进行过滤。
我的问题:

  • 有没有一种方法可以基于索引过滤IsarLinks对象的所有项?
  • 如果没有,执行我所描述的文本搜索的最佳方法是什么?作为一个额外的问题,为什么我不能使用IsarLinks来执行这个操作?

注意:我知道我可以简单地使用IsarLinks.filter并构建一个查询,选择所有Foo,其中text包含所有关键字,但我想知道是否有一种方法可以在IsarLinks上以Isar(带索引)推荐的方式进行文本搜索。

l5tcr1uw

l5tcr1uw1#

Isar不提供直接的方法来根据索引过滤IsarLinks对象的所有项。索引功能主要是为对象的单个属性而设计的,而不是像IsarLinks这样的复杂关系。
要基于text字段在链接的Foo对象上执行文本搜索,可以执行以下步骤:
1.从特定BarIsarLinks检索链接的Foo对象。
1.使用where方法和自定义条件根据搜索关键字筛选Foo对象。
1.使用不区分大小写的搜索条件匹配text字段中的关键字。
下面是文本搜索功能的示例实现:

import 'package:isar/isar.dart';

@Collection()
class Bar {
  @Id()
  int? id;

  final foos = IsarLinks<Foo>();

  // ... Bar stuff
}

@Collection()
class Foo {
  @Id()
  int? id;

  late String text;

  // ... Foo stuff
}

void searchTextInFoos(Bar bar, List<String> keywords) {
  final foos = bar.foos;

  final searchResults = foos
      .where((foo) => keywords.every(
            (keyword) => foo.text.toLowerCase().contains(keyword.toLowerCase()),
          ))
      .toList();

  // Use the searchResults as needed
}

在本例中,searchTextInFoos函数接受Bar对象和搜索列表keywords作为输入。它使用where方法根据关键字过滤链接到BarFoo对象。
where方法对每个Foo对象应用自定义条件,检查text字段中是否包含所有关键字。条件通过将textkeyword都转换为小写,使用不区分大小写的比较。
最后,搜索结果存储在searchResults列表中,您可以根据需要使用该列表。
虽然在索引的帮助下直接对IsarLinks对象执行全文搜索会很方便,但当前版本的Isar不提供此功能。但是,上面概述的方法允许您为链接的Foo对象实现所需的文本搜索功能。

相关问题