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
};
现在,我想做的是搜索并找到所有链接到特定Bar
的Foo
,这些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
(带索引)推荐的方式进行文本搜索。
1条答案
按热度按时间l5tcr1uw1#
Isar不提供直接的方法来根据索引过滤
IsarLinks
对象的所有项。索引功能主要是为对象的单个属性而设计的,而不是像IsarLinks
这样的复杂关系。要基于
text
字段在链接的Foo
对象上执行文本搜索,可以执行以下步骤:1.从特定
Bar
的IsarLinks
检索链接的Foo
对象。1.使用
where
方法和自定义条件根据搜索关键字筛选Foo
对象。1.使用不区分大小写的搜索条件匹配
text
字段中的关键字。下面是文本搜索功能的示例实现:
在本例中,
searchTextInFoos
函数接受Bar
对象和搜索列表keywords
作为输入。它使用where
方法根据关键字过滤链接到Bar
的Foo
对象。where
方法对每个Foo
对象应用自定义条件,检查text
字段中是否包含所有关键字。条件通过将text
和keyword
都转换为小写,使用不区分大小写的比较。最后,搜索结果存储在
searchResults
列表中,您可以根据需要使用该列表。虽然在索引的帮助下直接对
IsarLinks
对象执行全文搜索会很方便,但当前版本的Isar不提供此功能。但是,上面概述的方法允许您为链接的Foo
对象实现所需的文本搜索功能。