我一直在使用sqlite的FTS扩展,似乎无法弄清楚如何在匹配其他文本的其他文本时对一列进行短语搜索。通常,短语搜索适用于所有列,例如:
SELECT * from ftstable where ftstable MATCH '"Phrase With Spaces In It"';
以及具有以下内容的特定列:
SELECT * from ftstable where body MATCH '"Phrase With Spaces In It"';
但不适用于两列中的聚合搜索,例如:
SELECT * from ftstable where ftstable MATCH 'body:"Phrase With Spaces In It" title:"The*"';
而是抛出:
Error: malformed MATCH expression: [body:"Phrase With Spaces In It" title:"The*"]
我发现这个帖子声称不可能(2011年11月):http://osdir.com/ml/sqlite-users/2011-11/msg00363.html。有谁知道现在是否可以这样做?
我只能想象使用'INTERSECT'的解决方法,但问题是得到的两个相交的集合太大而且查询速度会慢得多,而且内存效率低,特别是因为我在移动设备上部署它。
感谢。
答案 0 :(得分:3)
你试过了吗?
SELECT * FROM ftstable WHERE (ftstable MATCH 'body:"phrase with spaces in it"') AND (ftstable MATCH 'title:The*')
答案 1 :(得分:1)
任何具有列说明符的过滤器都不能包含空格。它只是不起作用。这很奇怪,但却是真的。 col1:abc有效,col1:“abc”没有。 col1:“abc 123”没有(它只匹配任何带有“abc 123”的列)。
答案 2 :(得分:0)
我偶然发现了FTS4的相同问题,这要归功于林茨温德(Rinzwind)的comment停下来尝试使用引号找到一些解决方案。真的很奇怪。
罗伯特·霍克(Robert Hawkey)的idea对我也不起作用,因为它产生了一个异常:SQLiteQuery: exception: unable to use function MATCH in the requested context
。显然,MATCH
子句中不能有多个WHERE
。
我终于使用子选择解决了我的问题。对于此问题的示例,例如
SELECT * from ftstable WHERE body MATCH '"Phrase With Spaces In It"' AND rowid in (SELECT rowid from ftstable WHERE title MATCH '"The*"');