Android room fts4 MATCH 语法 AND OR

问题描述 投票:0回答:1

使用 room 和 FTS4 进行更复杂的 MATCH 查询的正确语法是什么 我在文档中找到了我想使用的语法

SELECT docid FROM docs WHERE docs MATCH '("sqlite database" OR "sqlite library") AND linux';
SELECT * FROM docs WHERE docs MATCH 'title:linux problems';

查询 结果
MATCH '("sqlite database" OR "sqlite library") AND linux'
(x)
MATCH '("sqlite database" OR "sqlite library") linux'
好的
MATCH 'content:("*sql*" OR "*lin*")'
好的(部分,只有最后一颗星有效,不会找到“mysql”)
MATCH 'content:sql* id:123'
好的
MATCH 'content:("*sql*" OR "*lin*") AND id:("*123*")'
(x)
MATCH 'content:("*sql*" OR "*lin*") id:("*123*")'
(x)

AND 似乎不起作用。我用引号或括号做错了,

基本上我想获得与 AND OR 相同的 LIKE 以及不同列上的不同值

android sql sqlite android-room fts4
1个回答
0
投票

我认为 AND 问题是只有 STANDARD 查询语法可用,而不是 ENHANCED 查询语法。

参见(增强)

与(标准)

STANDARD 语法不包含 AND 关键字,因此被视为单词本身。然而 AND 是隐含的,因此为什么

MATCH '("sqlite database" OR "sqlite library") linux'
返回预期结果。

  • 根据 仅支持 AND 运算符的隐式版本。将字符串“AND”指定为标准查询语法查询的一部分将被解释为包含术语“and”的文档集的术语查询。

关于

MATCH 'content:("*sql*" OR "*lin*")'
好的(部分,只有最后一颗星有效,不会找到“mysql”)

这是因为 FTS 试图匹配类似于索引的术语,如果它以通配符开头,则需要进行完整扫描,而不是跳到 s,然后是 sq,然后是 sql 等等。

  • 打个比方,尝试在电话簿中查找包含 a 的姓名,而不是查找以 a 开头的姓名。前者需要查看每一个条目。后者只需要查看以 a 开头的条目。

因此,我相信您可以/应该使用:-

MATCH 'content:("sql*" OR "lin*" OR "mysql*")'
© www.soinside.com 2019 - 2024. All rights reserved.