【问题标题】:MongoDB fulltext search + workaround for partial word matchMongoDB全文搜索+部分单词匹配的解决方法
【发布时间】:2014-01-27 21:59:32
【问题描述】:

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

【问题讨论】:

标签: mongodb full-text-search


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 投反对票可能是因为此响应几乎没有尝试解释解决方案的含义。在没有示例的情况下就如何实现所描述的内容提出更多问题和困惑。
    【解决方案3】:

    不知道这对面临这个问题的新人是否有用。

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

    db.collection.find( {query : {$regex: /querywords/}}).sort({'criteria': -1}).limit(limit)
    

    您需要如下索引:

    db.collection.ensureIndex( { "query": 1, "criteria" : -1 } )
    

    如果你有足够的内存,这可能会非常快。

    希望这会有所帮助。

    【讨论】:

    • 如果您不想从文本的开头搜索,那么无论如何都不会使用索引。在这种情况下索引只是浪费资源。
    【解决方案4】:

    Language stemming 在文本搜索中使用一种算法来尝试关联源自公共基础的单词(例如,“running”应该匹配“run”)。这与您要为自动完成功能实现的前缀匹配(例如,“blue”匹配“blueberry”)不同。

    为了最有效地使用 typeahead.js 和 MongoDB 文本搜索,我建议专注于 typeahead 中的 prefetch 支持:

    • 创建一个keywords 集合,其中包含您的集合中使用的常用词(可能与使用频率计数)。您可以通过running a Map/Reduce 在您拥有文本搜索索引的集合中创建此集合,并在添加新文档时使用定期Incremental Map/Reduce 使单词列表保持最新。

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

      李>

    然后您可以将生成的关键字 JSON 用于带有 typeahead 的 prefetch 功能的客户端自动完成功能:

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

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

    【讨论】:

    • 这是我想要的更多努力,但这是一个好主意!谢谢
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2023-01-02
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多