我有一个我正在尝试构建的查询,我想要进行一些自然语言搜索。我不确定在mysql中执行此操作的最佳方法。我相信mysql有一些我可以使用的很酷的自然语言。
我有两张表,如下所示。
1. transaction_category...
+--------------------+--------------------+-------------------+----------+
| tran_category_code | tran_category_desc | tran_category_seq | btn_type |
+--------------------+--------------------+-------------------+----------+
| CarParking | Car Parking | 2 | default |
| Electricity | Electricity | 1 | default |
| Groceries | Groceries | 4 | default |
| HealthInsurance | Health Insurance | 5 | default |
| Other | Other | 7 | default |
| Petrol | Petrol | 3 | default |
| Phone | Phone | 6 | default |
+--------------------+--------------------+-------------------+----------+
2. transaction_category_keyword...
+---------------------------------+------------------------------+--------------------+
| transaction_category_keyword_id | transaction_category_keyword | tran_category_code |
+---------------------------------+------------------------------+--------------------+
| 6 | Telstra | Phone |
| 7 | Park | CarParking |
| 8 | Coles | Groceries |
| 9 | Bp Connect | Petrol |
| 10 | Bupa | HealthInsurance |
+---------------------------------+------------------------------+--------------------+
我的查询在下面,并返回我想要的结果,但我只是想知道是否有人可以给我建议是否可以使用mysql的自然语言功能来改进。这对我有帮助,因为现在搜索非常简单,但我很快就会对它进行构建。
SELECT
tck.transaction_category_keyword_id,
tck.transaction_category_keyword,
tck.tran_category_code
FROM transaction_category tc, transaction_category_keyword tck
WHERE tc.tran_category_code = tck.tran_category_code
AND 'Coles Menai Syd Au' like '%' ||UPPER(tck.transaction_category_keyword) || '%'
+---------------------------------+------------------------------+--------------------+
| transaction_category_keyword_id | transaction_category_keyword | tran_category_code |
+---------------------------------+------------------------------+--------------------+
| 7 | Park | CarParking |
| 8 | Coles | Groceries |
| 10 | Bupa | HealthInsurance |
| 9 | Bp Connect | Petrol |
| 6 | Telstra | Phone |
+---------------------------------+------------------------------+--------------------+
感谢
答案 0 :(得分:1)
通常,如果搜索字段的开头和结尾都有通配符,那么在任何非平凡的表格大小上搜索都会相当慢,因为必须从每个字段开始搜索字段索引。
当您搜索单词包(及其在索引中的相对频率)时,您肯定会受益于全文搜索和匹配,而不是其他字段中的特定字符串。我假设你已经在http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html阅读了文档。您需要了解许多细微之处,例如停用词,布尔搜索,查询扩展等。这些页面上的注释非常好,因为它们具有之前曾经在那里进行过实验的人员的累积知识。
关于tf-idf这也是值得一读的,这就是MySQL(以及许多其他全文搜索)在内部工作的方式,参见docs,基本上根据罕见的组合对搜索进行排名所有文件中都有一个单词,特定文件中出现了多少次。
我无法向您提供任何更有针对性的示例或效果指标,因为您的问题是全文会优于搜索的双重通配符,答案是非常不合格的答案。
CAVEAT:总是值得一提的是,鉴于引擎之间存在差异,但在MySQL 5.6版本之前全文搜索只有MyISAM的文字,但之后也只有InnoDB。