【问题标题】:Full text search matching only certain words?全文搜索仅匹配某些单词?
【发布时间】:2012-06-14 16:57:32
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

  • 我无法接受答案的原因是我是盲人,我使用的屏幕阅读软件没有找到接受按钮。它似乎使用某种 dhtml,而不是常规链接或按钮(它只是显示为文本,所以我无法激活它)。我最近向 Stack Overflow 团队发送了有关此问题的电子邮件。
  • 明白。我希望他们可以为你补救。抱歉,我没有您的问题的答案。
  • 似乎 Stack Overflow 的人现在已经解决了这个问题。我终于可以接受答案了。
  • @user749473 可以使用字符距离作为近似值吗?我不完全确定您也无法从辅助表中获得单词距离。

标签: sql c sqlite


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您似乎可以通过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 和 lazy,这两个文档都匹配。

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      例如:- 你输入t 它会给 吨 茶 蒂莎

      还有数字 你输入1 你会gwt 1 112 1 13

      【讨论】:

      • 这似乎是一个匹配部分单词的查询。我正在寻找一种解决方案,允许我匹配整个单词,但不一定匹配查询中存在的所有单词。如果可能的话,我想匹配两个以上的单词,但并非所有单词都必须匹配。这有意义吗?
      • 具体,多举例,多研究
      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多