Sqlite FTS精确字

Sqlite FTS精确字,sqlite,full-text-search,match,Sqlite,Full Text Search,Match,返回:苹果,青苹果,苹果酱。。。 我需要只返回苹果的FTS查询。 这些工作很慢: SELECT * FROM my_table WHERE product MATCH "apple"; 对于FTS表,唯一有效的查询是匹配搜索 使用FTS4,您可以将搜索限制在带有^的文档开头: 然而,这对最终结果没有帮助 要对整个列进行有效检查,请先进行FTS搜索,然后检查结果: SELECT * FROM my_table WHERE product MATCH '^apple'; 像这样更改sql SEL

返回:苹果,青苹果,苹果酱。。。 我需要只返回苹果的FTS查询。 这些工作很慢:

SELECT * FROM my_table WHERE product MATCH "apple";

对于FTS表,唯一有效的查询是匹配搜索

使用FTS4,您可以将搜索限制在带有^的文档开头:

然而,这对最终结果没有帮助

要对整个列进行有效检查,请先进行FTS搜索,然后检查结果:

SELECT * FROM my_table WHERE product MATCH '^apple';

像这样更改sql

SELECT *
FROM (SELECT product
      FROM my_table
      WHERE product MATCH '^apple')
WHERE product = 'apple';

此sql意味着查找以apple开头、以apple结尾的术语。

FTS全文搜索的目的是查找所有精确匹配项和部分匹配项。当你搜索苹果时,它会找到苹果、绿苹果、苹果酱、苹果11、苹果123所有以苹果开头的单词或包括整个苹果单词在内的短语

如果要进一步缩小结果范围,可以将结果保存在db端的临时表中,并搜索临时表以查找精确匹配。或者您也可以在客户端执行此操作:

SELECT *
FROM my_table
WHERE product MATCH '^apple$'

不行!你仍然可以得到像“苹果派”这样的火柴。效果很好!建议使用产品匹配“^apple”的my_表中的SELECT*作为子查询,以获取所有列,这显然是OP的要求。谢谢+1Oh,另一个建议:我们必须在主查询中检查案例。因此,包含这两个建议的最终查询如下:从my_表中选择*FROM SELECT*,其中产品匹配“^apple”,其中LOWERproduct='apple';。希望它在发布此答案04年后仍能对其他人有所帮助。不确定是否在任何地方都支持它,但\b标记表示单词边界,因此\b应用\b即可。
SELECT *
FROM my_table
WHERE product MATCH '^apple$'
DataTable dt = dbHelper.GetProducts(params);

string exactProductName = "apple";

// delete products from the table which are not an exact match
for (int i = dt.Rows.Count - 1; i >= 0; i--)
{
   DataRow dr = dt.Rows[i];
   if (dr["product"].ToString() != exactProductName )
      dr.Delete();
}

dt.AcceptChanges();
// now your data table includes only the exact match