当前位置: 首页 > 知识库问答 >
问题:

在流星1.7+中可以订阅文本搜索光标吗

姜嘉赐
2023-03-14
MyCollection.find({ $text: { $search: 'foo' } }, {
  fields: {
    score: { $meta: "textScore" }
  },
  sort: {
    score: { $meta: "textScore" }
  }
});
I20180926-18:26:08.708(-4)? Exception from sub mysubscription id ZeSWJcoghED3t6Eq6 Error: Exception while polling query {"collectionName":"my-collection","selector":{"$text":{"$search":"foo"}},"options":{"transform":null,"limit":25,"sort":{"score":{"$meta":"textScore"}}}}: must have $meta projection for all $meta sort keys
I20180926-18:26:08.709(-4)?     at PollingObserveDriver._pollMongo (packages/mongo/polling_observe_driver.js:165:11)
I20180926-18:26:08.709(-4)?     at Object.task (packages/mongo/polling_observe_driver.js:93:12)
I20180926-18:26:08.710(-4)?     at Meteor._SynchronousQueue.SQp._run (packages/meteor.js:987:16)
I20180926-18:26:08.710(-4)?     at packages/meteor.js:964:12
collection.find({
    $text:
      {
        $search: filter,
        $caseSensitive: false,
        $diacriticSensitive: true
      }
    })
    .project({ score: { $meta: "textScore" } })
    .sort({score:{$meta:"textScore"}})

解决办法是什么?

共有1个答案

百里默
2023-03-14

下面有一个创建的迷你复制指南。它展示了如何执行一个(索引的)文本搜索,就像您最初报告的那样抛出一个错误。

因此,我们可以假设错误的来源,例如,在迁移到Meteor1.7+/Mongo3.6+时,或者在代码中。迁移很有可能包括原因,因为最近在论坛和SO上有许多关于升级到1.7的问题的帖子。

因此,这里有一个简短的清单,列出了可能出现的问题:

    null
meteor:PRIMARY> db.texts.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "meteor.texts"
    },
    {
        "v" : 2,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "text_text",
        "ns" : "meteor.texts",
        "weights" : {
            "text" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
    }
]
    null
  1. 创建一个新项目并安装faker(以快速创建一些文本):
$ meteor create metasearch
$ cd metasearch
$ meteor npm install --save faker
$ meteor
import { Mongo } from "meteor/mongo"
export const Texts = new Mongo.Collection('texts')
import { Meteor } from 'meteor/meteor'
import { Texts } from '../imports/Texts'

Meteor.startup(() => {
  import { lorem } from 'faker'
  for (let i = 0; i < 5; i++) {
    Texts.insert({
      title: lorem.words(),
      text: lorem.text()
    })
  }
})

Meteor.publish('search', function searchpub (filter) {
  const cursor = Texts.find({
    $text: {
      $search: filter,
      $caseSensitive: false,
      $diacriticSensitive: false,
    }
  }, {
    fields: {
      score: {$meta: 'textScore'},
    },
    sort: {
      score: {$meta: 'textScore'},
    },
  })

  // fallback if cursor is undefined
  if (cursor && cursor.count && cursor.count() >= 0) {
    return cursor
  } else {
    this.ready()
  }
})

正如您所看到的,它使用默认的“在一个文档中查询、投影和排序”结构,就像您最初发布的那样。

import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';

import './main.html';

import {Texts} from '../imports/Texts'

Template.hello.onCreated(function helloOnCreated() {
  // counter starts at 0
  this.counter = new ReactiveVar(0);

  const instance = this
  instance.autorun(() => {
    const cursor = instance.subscribe('search', 'dolor') // use a word, that often occurs
    if (cursor.ready()) {
      console.log(Texts.find().fetch())
    }
  })
});

// ... rest of the file
$ meteor mongo
$ db.texts.createIndex({text:"text"})

输出应类似于:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1,
    "operationTime" : Timestamp(1538031016, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1538031016, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

同时,meteor.startup诱导的插入应该创建了大量的文档来搜索,但它们可能还没有添加到索引中。

您可以取消正在运行的实例并重新启动几次(或增加启动时要插入的文档数量)以获得大量匹配。

Array (51) […]
​
0: {…}
_id: "n2WhMskCXBm7ziZea"
score: 1.0416666666666667
text: "Dolor at sed et dolorem tenetur a dolore voluptate incidunt. Rerum corrupti officia aut tenetur nisi officiis voluptas soluta. Fugiat eos sed expedita inventore. Esse cupiditate qui. Facere dolor quisquam ipsa a facere praesentium. Aut sunt mollitia dolore tenetur."
title: "quia est fuga"
<prototype>: Object { … }
​
1: {…}
_id: "QjAcZQLTH8Mc3jDzS"
score: 1.0110294117647058
text: "Sequi dolores omnis sequi consequatur laborum et asperiores. Accusantium repellat magnam est aut suscipit enim iure. Qui qui aut cupiditate necessitatibus commodi qui quia. Ut tempore autem provident maiores cumque necessitatibus dolores accusantium. Nostrum ut ut sunt adipisci qui consequuntur explicabo voluptas. Minima praesentium sunt facere doloribus non at dolor dolore est."
title: "est explicabo omnis"
<prototype>: Object { … }
 类似资料:
  • 我正在ruby平台上使用twitter流媒体API。在twitter gem的帮助下(https://github.com/sferik/twitter)我能找到流文本。 通过查看推文,我可以获得推文。 :文本= 但我需要准确的搜索文本,它输入了如下内容:search= 在检查推文,我得到的输出为

  • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

  • 我可以得到数字订阅频道,但通过困难的方法,我不知道这个方法是否正确。 首先我派人去找https://www.googleapis.com/youtube/v3/search?part=snippet 然后我为循环获取获取频道ID后每个频道的数字订阅 得到https://www.googleapis.com/youtube/v3/channels?part=statistics 然后我得到我的结果频

  • 我正在编写一种方法来搜索列表形式的文字文件,搜索用户输入的文字,但如果找到一个字母,程序将返回一个肯定的结果。例如,如果我搜索“f”,当没有单词时,它将返回字典中有一个单词“f”

  • 可能重复: 在锚中放置div是否正确? 当我们编写某种“产品列表”时,您只需要一个链接,但它应该包含产品图像、产品名称、产品标题等。我们可以使用contain p或其他标签吗?是否存在跨浏览器问题? 我听说在html5中,一个标签可以包含p标签,但是仍然没有使用它的信心。 一些代码是这样的:

  • 问题内容: 当我做… 邮政文档被添加并显示在列表的末尾,与我的发布功能中指定的降序相反。关于我在做什么错的任何想法吗? 谢谢! 问题答案: 发布功能确定哪些记录应同步到任何订阅客户端的mini- mongo数据库。因此,使用publish函数对数据进行排序实际上对客户端没有影响,因为客户端数据库可能会以其他方式存储它们。 当然,您可能希望在发布者的目录中使用sort,以将记录数限制为最近的N条-