我的应用程序中具有搜索功能,该功能允许用户搜索产品。当前查询是select * from products where title like '%search_term%'
这是实现此目的的一种快速而简单的方法。我现在想改善这一点,想知道如何做到这一点。
三个简短的例子
能够搜索复数。
如果用户搜索Golden Delicious Apple
,则该产品的标题可能是apples
。由于复数,该行将不会返回。
当某些单词可能是一个/两个单词时
我产品的标题可能是Lemon Cupcakes
,但是如果用户搜索cup cakes
如果用户搜索apples and lemons
,那么我应该返回示例1和2中的两行还是不返回任何内容?什么是最佳做法。
仅供参考,我正在使用python和peewee。我可以想到如何执行此操作的想法,但很快就会变得非常复杂。
最佳答案
好吧,根据所使用的数据库,有两种选择。
SQLite有一个非常好的全文搜索扩展,它支持词干分析(规范复数形式等)。 Peewee对SQLite FTS具有丰富的支持:
http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#FTSModel
http://charlesleifer.com/blog/using-sqlite-full-text-search-with-python/
Postgresql也通过tsvector
数据类型具有全文本。 Peewee也支持这一点:
http://docs.peewee-orm.com/en/latest/peewee/playhouse.html#TSVectorField
关于postgresql搜索的好帖子:http://blog.lostpropertyhq.com/postgres-full-text-search-is-good-enough/
最后,MySQL还支持全文搜索,尽管我还没有使用Peewee进行过尝试,但是我敢肯定它应该可以立即使用:
https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
关于问题2,“杯子蛋糕”->“杯子蛋糕”,我不确定在那种情况下最好的解决方案是什么。
关于问题3,我知道SQLite将正确处理查询中的布尔表达式,例如“苹果和柠檬”将匹配包含两个文件的文档,而“苹果或柠檬”将匹配包含另一个文件的文档。我想象postgres和mysql会做同样的事情。