7

我最近开始使用 SqlLite,所以我对它比较陌生。我正在尝试使用全文搜索功能来查找聊天机器人的粗略匹配项。基本上我想匹配尽可能多的关键字,但不一定是所有关键字。应根据在短语中找到多少关键字以及它们与查询的紧密程度对结果进行排序。换句话说,排序不一定要精确,但越接近,结果的排名就越高。同样,即使只找到短语中的一两个单词,它也应该匹配,但出现的单词越多,排名越高。我已经阅读了参考资料,看到了 NEAR 语句和 matchinfo 函数,以及如何使用它的示例,但我无法弄清楚如何将这些知识应用于我的具体问题。有没有人有什么建议?

在此先感谢您的帮助。

4

3 回答 3

1

最近有人告诉我,这在 SqlLite 邮件列表中是不可能的。我最接近的解决方案是像搜索引擎那样去除停用词,以及使用 porter stemmer 算法来进一步概括查询。首先搜索完整的关键字集(自然没有标点符号和类似的),然后搜索应用了词干提取的同一组关键词,然后搜索相同的一组但去除了停用词,最后搜索了同样的去除了词干的子集应用,似乎从最好到最坏给出了一个合理的近似值。当然,只要找到一些匹配项,就不会执行上面链中更一般的查询。

于 2012-06-16T13:59:23.393 回答
1

看起来您可以通过offsets辅助功能获取此信息。以下是更完整文档的链接:

4.1。偏移功能

基本上,您将函数添加到查询中,它将返回文档中的偏移量。

SELECT offsets(data) FROM data ...

每个结果都是一个空格分隔的 4 个整数列表。第三列是该列中匹配项的字节偏移量。您应该能够使用该信息制定解决方案。

这是一些探索性查询的记录。

sqlite> create virtual table data using fts4(body);

sqlite> insert into data(body) 
  values('the quick brown fox jumps over the lazy dog');

sqlite> insert into data(body) 
  values('the lazy brown fox quickly jumps over the lazy dog');

sqlite> select * from data where body match 'lazy';
the quick brown fox jumps over the lazy dog
the lazy brown fox quickly jumps over the lazy dog

sqlite> select rowid,offsets(data) from data where body match 'brown';
1|0 0 10 5
2|0 0 9 5

sqlite> select rowid,offsets(data) from data where body match 'lazy';
1|0 0 35 4
2|0 0 4 4 0 0 42 4

因此,如果您想搜索 brown 与 lazy,这两个文档都匹配。

对于第一个文档,brown 为 10,lazy 为 35。它们相距 25。

对于第二个文档,brown 位于 9,lazy 位于 4 和 42。它们相距 5 和 33。

它们还引用谓词的术语排序,尽管当我尝试匹配同一查询中的两个术语时它不起作用。我不确定我是否误解了,或者我只是不知道正确的语义。

我怀疑有一些 SQL 枢轴恶作剧可以用来在 sqlite 中进行所有排名计算。从 sqlite 中获取结果并自己进行排名数学可能更易于维护。

于 2012-06-17T18:38:09.297 回答
-1

这是你可以使用的 sql 查询....

Select * 
From Tablename 
Where Yourfield = '"+textbox.text(or any data)+"%'

这将为您提供该字段的所有数据,以文本中的字母或数字开头,或者您想要的任何内容

例如:- 你输入 t 它会给茶 tisha

ot数字你输入1你将gwt 1 112 1 13

于 2012-06-15T09:51:51.157 回答