【问题标题】:MongoDB > Text Query > Similar wordsMongoDB > 文本查询 > 相似词
【发布时间】:2019-08-01 09:52:13
【问题描述】:

如何在 mongo 文本查询中搜索相似的单词

相似词示例:'Jean' 'Jeann' 'Jeean' 'Jeaan'

我尝试了 mongo 的文本查询,我发现最好的事情是如果 2 个文档具有相同的单词但不同的值,我可以通过文本分数得到它们

我尝试过的示例:

我正在寻找“Jean”

{
 'name': 'Jean foo',
 'somethingElse': ['one', 'two', 'three']
},
{
 'name': 'Jean bar',
 'somethingElse': ['one']
},
,
{
 'name': 'Jean',
 'somethingElse': ['one']
}

我得到了 3 个带有文本分数的文档,它运行良好,但我无法得到这样的文档

{
 'name': 'Jeaan',
 'somethingElse': ['one']
}

数据示例:

{
 'name': 'Jean',
 'somethingElse': ['one', 'two', 'three']
},
{
 'name': 'Jeaan',
 'somethingElse': ['one']
}
{
 'somethingElse': 'Jeann',
 'categories': ['one', 'two']
}

【问题讨论】:

  • 你应该给“相似词”一个更好的定义。你的例子可以用正则表达式解决:db.collection.find({ name: { $regex: "J+e+a+n+"}})
  • 在这个例子中,如果我查询'Jean',我会得到前 2 个 textScore 为 0.75 的文档,第 3 个是完美的 ``` { 'name': 'Jean foo', ' somethingElse': ['one', 'two', 'three'] }, { 'name': 'Jean bar', 'somethingElse': ['one'] }, , { 'name': 'Jean', ' somethingElse': ['one'] } ``` 但是如果我有一个像这样的文档,我希望它以例如 0.3 的分数返回,但它根本没有被返回,因为它与确切的名称不匹配'Jean' ``` { 'name': 'Jeaaan', 'somethingElse': ['one'] } ```

标签: mongodb


【解决方案1】:

在名称列上创建文本索引:

创建了名为 shop 的集合:

 db.shop.insertMany([{
    ...  'name': 'Jean',
    ...  'somethingElse': ['one', 'two', 'three']
    ... },
    ... {
    ...  'name': 'Jeaan',
    ...  'somethingElse': ['one']
    ... },
    ... {
    ...  'somethingElse': 'Jeann',
    ...  'categories': ['one', 'two']
    ... }])
    {
            "acknowledged" : true,
            "insertedIds" : [
                    ObjectId("5d42c7be2f40da142ffb5106"),
                    ObjectId("5d42c7be2f40da142ffb5107"),
                    ObjectId("5d42c7be2f40da142ffb5108")
            ]
    }

Step2:在名称字段上创建文本索引:

db.shop.createIndex({name:"text"})

第三步:

db.shop.find({$text:{$search:"Jean Jeann Jeean Jeaan"}})

输出:

{ "_id" : ObjectId("5d42c7be2f40da142ffb5107"), "name" : "Jeaan", "somethingElse" : [ "one" ] }
{ "_id" : ObjectId("5d42c7be2f40da142ffb5106"), "name" : "Jean", "somethingElse" : [ "one", "two", "three" ] }

【讨论】:

  • 这不是我要寻找的,只是如果我搜索名称“James”,我希望返回带有“Jamesss”“Jamees”的文档并带有相关性分数.. 恐怕这是不可能的在蒙戈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多