MongoDB -搜索多个字符串,要求最少的命中

5f0d552i  于 2023-01-01  发布在  Go
关注(0)|答案(1)|浏览(103)

我正试图获得一些文件取决于什么查询您键入。
例如,我有一堆文档:

[
  {name: 'jon', city: 'la', country: 'us'},
  {name: 'foo', city: 'ca', country: 'us'},
  {name: 'alf', city: 'ca', country: 'us'},
  {name: 'olla', city: 'la', country: 'us'},
  {name: 'prol', city: 'la', country: 'us'},
  {name: 'jon', city: 'ca', country: 'us'}
]

如果我查询jon la,我需要{name: 'jon', city: 'la'}作为结果。
我使用Mongoose和find()方法。
我尝试了正则表达式和文本搜索索引。
使用文本:

.find({
  '$text': {
       $search: 'jon la'
   },
})

使用正则表达式:

.find({
  '$or': [
    { name: { $regex: '^jon|^la' } },
    { city: { $regex: '^jon|^la' } },
    { country: { $regex: '^jon|^la' } }
],
})

我从这两种方法中得到了以下结果:

{name: 'jon', city: 'la', country: 'us'},
  {name: 'olla', city: 'la', country: 'us'},
  {name: 'prol', city: 'la', country: 'us'},
  {name: 'jon', city: 'ca', country: 'us'}

这里的问题是,我永远不知道它是否应该在name、city或对象中的任何其他键上找到。例如,查询可以是jon us,那么我希望在us中获得所有jon,而不是所有jon和所有us。
我怎样才能做到这一点?
我正在考虑一个选项,例如

hvvq6cgz

hvvq6cgz1#

如果您明确需要name=joncity=la(或它们的正则表达式)的文档,就不要使用$or

.find({
  name: { $regex: '^jon' },
  city: { $regex: '^la' }
})

如果问题是您不知道要搜索什么(例如,您需要查找匹配超过2个单词的结果),那么事情就更复杂了,我认为您需要使用聚合管道。
如果您关心的是查找“最佳n”匹配项,则可以使用全文搜索评分

.find(
  '$text': {
       $search: 'jon la'
   },
   { score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )

有关textScore的更多信息,请访问:https://www.mongodb.com/docs/manual/reference/operator/query/text/

相关问题