我正在尝试在mongo中为我的数据库实现某种搜索引擎。它应该与“ foo AND(bar OR pie)”之类的基本逻辑配合使用。
首先,我使用了正则表达式搜索,因此查询就像:
{'text': {'$regex': my_pattern_based_on_keywords}}
。
看来,这种方法对于〜5k记录来说有点慢〜15s。很有可能是因为正则表达式复杂。
为了提高性能,我在包含消息的“文本”字段上创建了文本索引。代码就像
collection.create_index([('text',pymongo.TEXT)])
query={'$and':[
{'$text': {'$search':_filter.soft_regex_words}},
{'text': {'$regex':keywords,'$options':'i'}}]}
其中_filter.soft_regex_words
是用户查询中的单词。因此,对于“ foo AND bar”,soft_regex_words为“ foo bar”。
不幸的是,消息是用mongo不支持的语言编写的,因此这种方法会不断删除应由mongo返回的文档。例如,当我要求输入“ Egg”时,即使包含正则表达式的搜索也不会返回任何包含“ Eggs”的消息。
创建像collection.create_index([('text',1)])
这样的索引不起作用,因为消息太大而无法索引(我猜是超过1024个字节)。
所以基本上我现在在这里,老实说,我不知道如何提高此请求的性能。你们有一些经验或知识可能在这种情况下会有所帮助吗?
AFAIK mongo为$ text $ search方法提供基本词干和其他有用的功能,但仅适用于受支持的语言。有没有办法通过一些代码来模仿此功能?