全文搜索 - 仅搜索某些字段而不是全部

时间:2016-11-16 14:09:25

标签: mongodb full-text-search mongodb-query

假设我的mongo数据库中有以下数据:

{
    "_id" : ObjectId("582b89866b6347a422ab525d"),
    "phnum" : "+11111230023",
    "fax" : "",
    "description" "11111230023"
}

{
    "_id" : ObjectId("582b89866b6347a422ab525d"),
    "phnum" : "+12221230023",
    "fax" : "",
    "description" ""
}

我通过执行以下操作创建了一个索引:

> use widgets
switched to db widgets
> db.ph.createIndex( { "$**": "text" } ,{ default_language: "english" }, {name:"widgettextindex"})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

然后确认它就像那样:

> db.ph.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "widgets.ph"
    },
    {
        "v" : 1,
        "key" : {
            "_fts" : "text",
            "_ftsx" : 1
        },
        "name" : "$**_text",
        "ns" : "widgets.ph",
        "default_language" : "english",
        "weights" : {
            "$**" : 1
        },
        "language_override" : "language",
        "textIndexVersion" : 2
    }
]
> 

问题

当我尝试运行“0023”的查询时,我只回复了两个文件中的一个。

> db.ph.find({'$text':{'$search':'0023'}})
{ "_id" : ObjectId("582b897b6b6347a422ab49c0"), "phnum" : "+11111230023", "fax" : "", "description" : "11111230023" }

问题

  1. 关于我缺少什么/为什么我没有找回这两个记录的任何想法?
  2. 一旦创建了文本索引,我是否需要做任何事情来“维护”它......或者系统是否自己重新索引?
  3. 感谢。

    PS。我有两个mongo服务器......一个是3.0.4,另一个是3.2.10。我两个都有同样的问题...这让我觉得这是我创建索引的方式的问题。

    编辑1

    仔细检查后,系统似乎没有在phnum字段中查找匹配项 我以前没有注意到一直被返回的记录在描述中有一个phnum的副本。 作为测试,我将文本“0023”添加到搜索未返回的文档中的描述字段中。然后我重试了搜索,现在两个记录都被退回了。

    如何让索引适用于所有字段? 我认为“$ **”语法会索引所有字段。

    哦,这个问题也是通过mongo命令行发生的。不只是通过PHP mongoclient。我会更新帖子的标题。

    编辑2

    我还尝试通过明确列出我要搜索的字段来重新创建索引:

    > db.did.createIndex( {"phnum": "text","description":"text"} ,{ default_language: "english" }, {"name":"didtextindex"})
    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }
    

    但这仍然无法解决问题。我无法在phnum字段中搜索值。

0 个答案:

没有答案