全文搜索仅匹配某些单词?

时间:2012-06-14 16:57:32

标签: sql c sqlite

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我最近被告知,这在SqLite邮件列表中是不可能的。我最接近解决方案是剥离像搜索引擎那样的停用词,以及使用porter stemmer算法进一步推广查询。首先搜索完整的关键字集(自然没有标点符号和类似关键字),然后搜索同一组关键字并应用词干,然后搜索相同的集合,但停止单词被剥离,最后搜索带有词干的相同剥离子集应用,似乎给出了从最好到最差的合理近似值。当然,只要找到一些匹配项,就不会执行上面链中更常见的查询。

答案 1 :(得分:0)

这个sql查询你可以使用....

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

这将为你提供该字段的所有数据,从textbos中的leter或number开头,或者你想要的任何内容

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

也是数字 你输入1 你将gwt 1 112 1 13

答案 2 :(得分:0)

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

4.1. The Offsets Function

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

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 vs lazy,这两个文档都匹配。

对于第一个文件,褐色是10,懒惰是35.它们相隔25。

对于第二个文件,褐色是9,懒惰是4和42.它们分别是5和33。

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

我怀疑有一些SQL pivot shenanigans可用于在sqlite中进行所有排名计算。从sqlite中获取结果并且自己进行排名数学可能更容易维护。