MongoDB全文搜索+;部分单词匹配的解决方法

MongoDB全文搜索+;部分单词匹配的解决方法,mongodb,full-text-search,Mongodb,Full Text Search,由于使用mongodb全文搜索无法通过单词“blue”找到“blueberry”,因此我想帮助我的用户完成单词“blue”到“blueberry”的搜索。要做到这一点,是否可以查询mongodb全文索引中的所有单词->我可以将这些单词用作建议,即对于typeahead.js?您不能查询索引中的所有单词,但您当然可以查询原始文档的字段。搜索索引中的单词也不总是完整的单词,但无论如何都是词干。因此,您可能在索引中找不到“blueberry”,而只找到“blueberri”。在文本搜索中,使用一种算法

由于使用mongodb全文搜索无法通过单词“blue”找到“blueberry”,因此我想帮助我的用户完成单词“blue”到“blueberry”的搜索。要做到这一点,是否可以查询mongodb全文索引中的所有单词->我可以将这些单词用作建议,即对于typeahead.js?

您不能查询索引中的所有单词,但您当然可以查询原始文档的字段。搜索索引中的单词也不总是完整的单词,但无论如何都是词干。因此,您可能在索引中找不到“blueberry”,而只找到“blueberri”。

在文本搜索中,使用一种算法尝试关联从公共基础派生的单词(例如,“running”应与“run”匹配)。这不同于要为自动完成功能实现的前缀匹配(例如“蓝色”匹配“蓝莓”)

为了在MongoDB文本搜索中最有效地使用
typeahead.js
,我建议将重点放在typeahead中的
prefetch
支持上:

  • 创建一个
    关键字
    集合,其中包含集合中使用的常用词(可能具有使用频率计数)。您可以通过在已启用文本搜索索引的集合中创建此集合,并在添加新文档时使用定期更新来保持单词列表最新

  • 让您的应用程序从
    关键字
    集合中生成一个JSON文档,其中包含唯一的关键字(可能仅限于基于词频的“流行”关键字,以保持列表的可管理性/相关性)

然后,您可以使用生成的关键字JSON进行客户端自动完成,并使用typeahead的
预回迁
功能:

$('.mysearch .typeahead').typeahead({
  name: 'mysearch',
  prefetch: '/data/keywords.json'
});

typeahead.js
将在本地存储中缓存
prefetch
JSON数据,用于客户端搜索。提交搜索表单后,您的应用程序可以使用服务器端按相关顺序返回完整结果。

不知道这是否对一些面临此问题的新手有用

根据集合的大小和可用RAM的大小,您可以通过创建适当的索引按$regex进行搜索。例如:

db.collection.find( {query : {$regex: /querywords/}}).sort({'criteria': -1}).limit(limit)
您需要一个索引,如下所示:

db.collection.ensureIndex( { "query": 1, "criteria" : -1 } )
如果你有足够的内存,这可能会非常快


希望这能有所帮助。

我现在正在做的一个简单的解决方法是将文本分解为单独的字符,存储为文本索引数组

然后,当您执行
$search
查询时,只需再次将查询拆分为字符


请注意,这只适用于短字符串,如长度小于32,否则建立索引的过程将花费很长时间,因此插入新记录时性能将显著下降。

对于那些尚未开始实施任何数据库体系结构并在此寻求解决方案的人,请使用Elasticsearch。它是一个json文档驱动的数据库,在结构上类似于mongodb。它有“edge ngram”分析器,它能快速有效地为你提供拼写错误的搜索结果。您也可以部分搜索

我认为这还不存在,您可能可以使用查询条件,但我相信它们没有评分:谁说在MongoDB中字符串的部分匹配是不可能的@Denizzoetman我不确定你是否理解这个问题,这是关于FTS而不是一般的查询。你可以尝试这里提到的解决方案:这是我想要的更多努力,但却是一个巧妙的想法!THXI若您不想从文本开始搜索,那个么无论如何都不会使用索引。在这种情况下,索引只是浪费资源。投票被否决可能是因为这个回答很少试图解释解决方案是关于什么的。提出了更多的问题和困惑,没有例子说明如何实现所描述的目标。