On Sep 29, 2011, at 3:30 PM, Mr. Puneet Kishor wrote:
> Well, defeated by FTS4 for now, I will try the following approach --
[didn't follow the thread blow by blow, so apologies if this was already
covered and dismissed :)]
Before you jump to the deep end...
FTS tables are meant to be accessed by either their rowid or queried with a
match qualifier. Anything else will be rather slow, as it will result in a full
table scan. See section 1.4. "Simple FTS Queries" of the fine manual [1].
Looking at the DDL you posted original, you have:
CREATE VIRTUAL TABLE fts_uri USING fts4 (uri_id, uri_content);
That uri_id is not helping anything, as you cannot really use it to lookup the
table (see section "1.3. Populating FTS Tables" [2]) . You should instead drop
it, and simply set the rowid of your FTS table to the uris.uri_id.
So:
CREATE VIRTUAL TABLE fts_uri USING fts4 (uri_content); -- don't bother with
uri_id here, as it cannot be used for lookups
Now populate fts_uri with the content of uris, using the same rowid for both:
insert
into fts_uri
(
rowid,
uri_content
)
select uris.uri_id,
uris. uris
from uris
Also, it would appear that you are storing your content twice: once in uris.
uri_content and once again in fts_uri. uri_content. That's once too many.
>From uris, you can retrieve your content directly from fts_uri:
select *
from uris
join fts_uri
on fts_uri.rowid = uris.uri_id
No point in storing the data twice as you can retrieve the text verbatim from
fts_uri without much ado.
And now you can access uris directly from fts_uri as well as they share the
same rowid.
Now, for your search, decompose the problem:
(1) do the FTS first, assuming it's the most selective part of your query
select fts_uri.rowid as uri_id,
snippet(fts_uri, '<span class="hilite">', '</span>', '…', -1,
64) snippet
from fts_uri
where fts_uri.uri_content match 'education,school'
Is that slow?
(2) Add joins one by one
select fts_uri.rowid as uri_id,
snippet(fts_uri, '<span class="hilite">', '</span>', '…', -1,
64) snippet,
uris.uri as uri,
uris.downloaded_on as downloaded_on
from fts_uri
join uris
on uris.uri_id = fts_uri.rowid
where fts_uri.uri_content match 'education,school'
Is that slow?
Repeat and rinse :)
[1] http://www.sqlite.org/fts3.html#section_1_4
[2] http://www.sqlite.org/fts3.html#section_1_3
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users