如何使用Android Room搜索一个或多个单词的任意组合,而不考虑它们的顺序

如何使用Android Room搜索一个或多个单词的任意组合,而不考虑它们的顺序,android,sql,full-text-search,android-room,Android,Sql,Full Text Search,Android Room,我已经能够在Android Room+FTS中实现基本的搜索功能,在我的Dao中以以下查询为例: @Query("SELECT * FROM Conversation JOIN ConversationFts ON Conversation.id == ConversationFts.id WHERE ConversationFts.title LIKE :text GROUP BY Conversation.id") public abstract DataSource.F

我已经能够在Android Room+FTS中实现基本的搜索功能,在我的Dao中以以下查询为例:

@Query("SELECT * FROM Conversation JOIN ConversationFts ON Conversation.id == ConversationFts.id WHERE ConversationFts.title LIKE :text GROUP BY Conversation.id")
public abstract DataSource.Factory<Integer, Conversation> search(String text);
文本在百分比字符之间传递的位置,例如%lorem%

这个例子非常适合搜索单个单词,我想扩展它,以便能够搜索一个或多个单词,条件是它们不需要按照输入的顺序,但必须与所有单词匹配。这意味着这必须是一种与非或的情况

我发现了一些SQL查询的示例,但它们需要为每种情况定制一个特定的查询,例如:LIKE text和LIKE other等。。。这不是一个解决办法

如何做到这一点?为了说明这一点,我不是在寻找一个原始查询解决方案,我希望尽可能多地使用Room,否则,我宁愿按原样使用它,而不是求助于原始查询

编辑:为每个请求添加一个示例

我搜索返回的结果是否包括标题中包含do的所有匹配项,即使它是部分匹配项

我搜索do和test返回的结果包括所有包含do和test的匹配,但没有特定的顺序,即使它们是部分匹配


但是,如果在文本中找不到其中一个,则不会在结果中返回。例如,如果找到了do,但没有找到test,那么它将不会成为结果的一部分。

我认为除了动态创建原始查询之外,没有其他方法可以做到这一点。您可以编写另一个方法,如下所示:

public abstract class ConversationDao {

    public DataSource.Factory<Integer, Conversation> search(String text) {
        StringBuilder builder = new StringBuilder();
        String[] words = text.split("\\s+");

        if (words.length > 0) {
            builder.append(" WHERE ");
        }

        for (int i = 0; i < words.length; i++) {
            builder.append("ConversationFts.title LIKE %").append(words[i]).append("%");
            if (i < words.length - 1) {
                builder.append(" AND ");
            }
        }

        SupportSQLiteQuery query = new SimpleSQLiteQuery(
                "SELECT * FROM Conversation JOIN ConversationFts ON Conversation.id == ConversationFts.id"
                        + builder.toString()
                        + " GROUP BY Conversation.id"
        );
        
        return search(query);
    }

    @RawQuery
    public abstract DataSource.Factory<Integer, Conversation> search(SupportSQLiteQuery query);

}

这不是一个解决方案-为什么不?@commonware这意味着构建一个原始查询,而不是只传递一个单词列表,这不是我在这里要寻找的。诉诸原始查询不是我在这里的目标,但忽略您的示例与我发现的其他示例完全一样,它们遵循单词的顺序,当我想要的话的顺序不重要。i、 e.如果我搜索hey and you,我希望所有匹配项都包含这些词,无论它们的顺序如何。AFAIK在SQL中没有您想要的功能。顺便说一下,上面的解决方案并不关心单词的顺序。每个单词都应该满足一个单独的从句,它们的顺序无关紧要。我想我忘记了LIKE子句中的%。我一直在寻找另一种方法来实现这一点,但正如你所说的,根本没有。因此,我会接受你的回答,因为它符合我的要求,即使不是我想要的方式。这听起来像是一场等待发生的sql注入噩梦