【问题标题】:MongoDB: Perform a text-search in a document field (using high-level API)MongoDB:在文档字段中执行文本搜索(使用高级 API)
【发布时间】:2014-11-03 15:52:30
【问题描述】:

可能和这个问题有关 Basic GROUP BY statement using OPA MongoDB high level API.

我希望能够检索“名称”字段值包含给定字符串的文档列表。

这是我的文件清单:

{name: "Charles-Hugo"}, {name: "Jean Pierre"}, {name: "Pierre Dupont"},

我希望能够仅检索名称包含“Pierre”字符串的文档:Jean Pierre 和 Pierre Dupont。

我知道这对于 MongoDB 高级 API 是不可能的。 我查看了低级 API 函数,但我不知道以安全 Opa 类型检索我的文档的最简单方法是什么。

我还想在我的查询中添加跳过/限制选项。

有什么想法吗?

【问题讨论】:

  • 我对Opa一无所知,但这可能会对您有所帮助stackoverflow.com/questions/3305561/…
  • 谢谢,但我知道如何使用 Mongo shell 执行此查询。 Opa 语言稍微复杂一些。

标签: mongodb opa


【解决方案1】:

Opa 中的 DbGen 自动化机制对此提供了支持:

DbSet.iterator(/path/data[name =~ pattern])

【讨论】:

【解决方案2】:

正如@Henri 指出的那样,自从提交[enhance] DbGen: add case insensitive regex operator =~ 以来,Opa 中就有正则表达式搜索支持,这非常好。

请注意,它使用的是 $regex 运算符,而不是全文索引,它可能会导致一些性能损失 :( 由于 MongoDB documentation says $regex 运算符以有限的方式使用索引 - 仅用于前缀搜索:模式 @987654327 @. 在文本中的任何位置搜索Jean 都需要完整扫描。

就个人而言,我正在使用 Mongo 的 full-text index 功能和 Opa 的“低级”API 来执行 $text 命令,如下所示:

  function list({float score, Article.id id}) textSearch(string query) {
    function onfailure(failure) {
      cat.error("textSearch({{~query}}): {failure}");
      [];
    }
    function onsuccess(success) {
      function aux(~{name,value}) {
        name == "results";
      }
      match (List.filter(aux, success)) {
      | [] :
        // `results` field not found - error
        onfailure(success);
      | results:
        cat.debug("textSearch({~{query}}): {results}");
        function ({~score, obj: ~{id}}) {
          ~{score, id}
        }
        |> List.map(_, Bson.doc2opa(results) ? []);
      }
    }

    opts = [H.str("search", query), H.doc("project", [H.i32("_id",0), H.i32("id",1)])];
    //  { search: query, project: {_id:0, id:1}, }
    //  |> Bson.opa2doc
    outcome = MongoCommands.simple_str_command_opts(ll_db, db_name, "text", coll_name, opts);
    MongoCommon.outcome_map(outcome, onsuccess, onfailure)
  }

从 2.4 开始,Mongo 中的功能是实验性的(您必须通过特殊的配置选项将其打开),在 2.6 中作为稳定版(默认打开)。

【讨论】:

  • 谢谢马尔辛。我们可能还会绑定$text 命令。如果您想按照您所指的提交提交拉取请求,我们将很乐意接受。
  • 我仍然没有将我的数据库迁移到 2.6 版。我的应用程序中的索引存在一些问题。添加一些索引(在 2.4 中)后,查询以不同的方式解释,返回的文档数量限制不再起作用。它可能与 MongoDB 对多键索引的限制有关。奇怪的是,在 2.4 中运行良好的集合数据库在 2.6 中的行为方式相同(没有附加索引)。当我解决这个问题时,我会将应用程序从我当前的 text 命令(在 2.6 中弃用)迁移到 $text 查询运算符(自 2.6 起可用)。
猜你喜欢
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多