查询mongodb集合:$text with a score vs.$all(pymongo)

2024-10-02 04:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我收集了很多这样的文件:

{
   _id: ObjectId("879878g9fds87gsd8978f"),
   text1: "this ball and this ball are toys in the house",
   text2: "this is a car and a space boat",
   text3: "this ball is a toys in the house this is a car and a space boat computer is a hammer",
   keywordst3: ["ball", "toys", "house", "car", "boat", "computer", "hammer"],
}
  • keywordst3-是一个字段,它将text1、text2、text3中的所有单词集合起来并进行数组。在

我收到用户输入(搜索条件),我需要从集合中查找相关文档。在

当涉及到由2个以上单词组成的搜索条件时,我面临一个困难。在

以上述文件为例:

搜索条件:ball

第一路:

^{pr2}$

这将使我的搜索与关键字列表相匹配,并正确返回文档。在

第二种方式:

keywords = 'ball'
collection.find({'$text': {'$search': keywords}}, {'score': {'$meta': "textScore"}})

这将返回一个带有相关“textScore”的文档光标。分数越高,文档与搜索条件的相关性就越高。在单词搜索的情况下,如果该词被多次找到,得分会更高。在

这个场景可以正常工作。但现在我面临的挑战是:

搜索条件:ball toys

第一路:

keywords = ['ball', 'toys']
collection.find({"keywordst3": {'$all': 'keywords'})

返回在keywordst3中找到这两个关键字的文档。““坚硬”和条件。在

第二种方式:

keywords = 'ball toys'
collection.find({'$text': {'$search': keywords}}, {'score': {'$meta': "textScore"}})

事情变得很奇怪。。。我得到了一份有分数的文件列表,但我不能完全信任它们:

  • 对于两个词都匹配的文档,得分可能为0.9。在
  • 如果一个单词被提到了4次,那么1.1分就可以了。在
  • 一个单词匹配一次的文档的分数可能是0.6。在
  • ……等等。。。我不知道得分的规则。。。在

所以现在我很困惑如何为我的用户提供最好的搜索结果。在

我的想法是:

  • 一方面,$all匹配是一件好事,可以稳定地返回精确匹配。但是如果一个用户搜索两个彼此相关的词呢。例如:bernie sanders。在我的文档集(这些实际上是新闻文章)中,有些文档只有bernie。。。$all将跳过这些。在
  • 这就是$text和{}的作用。如果用户搜索的短语与两个单词之间有关联:bernie sanders,那么$text和{}是一个非常好的方法,即使文档中只提到了一个单词,也可以按textscore进行排序。然而,如果搜索短语中的两个(或更多)单词彼此不相关:ball ship-在上面的文档示例中,该文档的分数仍然很高,因为ball被提到了两次,但是{}根本不存在,所以如果我仍然根据分数来计算结果,我可能会给用户一个不正确的结果。在

我想解决这个问题的一个方法是同时使用这两种方法。在

  1. 首先使用$text并获得一组文档(300…)按其分数降序排序。所以最高的比赛是在顶部。在
  2. 迭代该集合,尝试将两个关键字与关键字列表匹配。在

    • 如果在第二步,我发现一个文档从一个高分集,两个关键字都存在于关键字列表=头奖!这绝对是个好结果。在
    • 如果在第二步中,我没有对两个关键字的文档进行优化,那么我只需选择得分最高的文档并将其交给用户。它可能仍然是不正确的,但至少“我尽了最大的努力”和最高的分数给了一个文档是正确的很好的机会。在

如果我遗漏了什么,你能评估一下我的“疯狂”并开导我吗?对此,有什么更好的方法?在


Tags: 方法text用户文档列表is关键字this

热门问题