如何改进我的自然语言搜索查询

时间:2014-08-12 05:46:06

标签: mysql

我有一个我正在尝试构建的查询,我想要进行一些自然语言搜索。我不确定在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              |
+---------------------------------+------------------------------+--------------------+

感谢

1 个答案:

答案 0 :(得分:1)

通常,如果搜索字段的开头和结尾都有通配符,那么在任何非平凡的表格大小上搜索都会相当慢,因为必须从每个字段开始搜索字段索引。

当您搜索单词包(及其在索引中的相对频率)时,您肯定会受益于全文搜索和匹配,而不是其他字段中的特定字符串。我假设你已经在http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html阅读了文档。您需要了解许多细微之处,例如停用词,布尔搜索,查询扩展等。这些页面上的注释非常好,因为它们具有之前曾经在那里进行过实验的人员的累积知识。

关于tf-idf这也是值得一读的,这就是MySQL(以及许多其他全文搜索)在内部工作的方式,参见docs,基本上根据罕见的组合对搜索进行排名所有文件中都有一个单词,特定文件中出现了多少次。

我无法向您提供任何更有针对性的示例或效果指标,因为您的问题是全文会优于搜索的双重通配符,答案是非常不合格的答案。

CAVEAT:总是值得一提的是,鉴于引擎之间存在差异,但在MySQL 5.6版本之前全文搜索只有MyISAM的文字,但之后也只有InnoDB。